Namespaces
Variants

Logical operators

From cppreference.net

논리 연산자는 피연산자에 표준 불리언 대수 연산을 적용합니다.

연산자 연산자 이름 예시 결과
! 논리 NOT ! a a 의 논리 부정
&& 논리 AND a && b a b 의 논리 AND
|| 논리 OR a || b a b 의 논리 OR

목차

논리적 NOT

논리적 NOT 표현식의 형식은 다음과 같습니다

! expression

여기서

expression - 임의의 scalar type 표현식

논리 NOT 연산자의 타입은 int 입니다. 이 연산자의 값은 expression 이 0과 비교하여 다른 값으로 평가되면 0 입니다. expression 이 0과 비교하여 같은 값으로 평가되면 이 연산자의 값은 1 입니다. (따라서 ! E ( 0 == E ) 와 동일합니다)

#include <stdbool.h>
#include <stdio.h>
#include <ctype.h>
int main(void)
{
    bool b = !(2+2 == 4); // 참이 아님
    printf("!(2+2==4) = %s\n", b ? "true" : "false");
    int n = isspace('a'); // 'a'가 공백이면 0이 아닌 값, 아니면 0
    int x = !!n; // "bang-bang", 정수를 [0,1]로 매핑하는 일반적인 C 관용구
                 // (모든 0이 아닌 값은 1이 됨)
    char *a[2] = {"non-space", "space"};
    puts(a[x]); // 이제 x를 2개의 문자열 배열 인덱스로 안전하게 사용 가능
}

출력:

!(2+2==4) = false
non-space

논리 AND

논리 AND 표현식의 형식은 다음과 같습니다

lhs && rhs

여기서

lhs - 임의의 스칼라 타입 표현식
rhs - lhs 0 과 같지 않을 때만 평가되는 임의의 스칼라 타입 표현식

논리 AND 연산자는 int 타입을 가지며, lhs rhs 모두 0과 비교 시 같지 않으면 값 1 을 가집니다. 그렇지 않은 경우( lhs 또는 rhs 중 하나 또는 둘 모두가 0과 비교 시 같은 경우) 값 0 을 가집니다.

lhs 의 평가 이후에 시퀀스 포인트 가 있습니다. lhs 의 결과가 0과 같으면, rhs 는 전혀 평가되지 않습니다 (이른바 단락 평가 )

#include <stdbool.h>
#include <stdio.h>
int main(void)
{
    bool b = 2+2==4 && 2*2==4; // b == true
    1 > 2 && puts("this won't print");
    char *p = "abc";
    if(p && *p) // 일반적인 C 관용구: p가 null이 아니고
                // p가 문자열의 끝을 가리키지 않는 경우
    {           // (단락 평가 덕분에 이 코드는 null 포인터 역참조를 시도하지 않음)
    // ...      // ... 문자열 처리를 수행
    }
}

논리적 OR

논리적 OR 표현식의 형식은 다음과 같습니다

lhs || rhs

여기서

lhs - 임의의 스칼라 타입 표현식
rhs - lhs 0 과 비교하여 같을 경우에만 평가되는 임의의 스칼라 타입 표현식

논리적 OR 연산자는 int 타입을 가지며, lhs 또는 rhs 중 하나가 0과 비교하여 다른 경우 값 1 을 가집니다. 다른 경우(즉, lhs rhs 모두 0과 비교하여 같은 경우) 값 0 을 가집니다.

lhs 의 평가 이후에 시퀀스 포인트 가 존재합니다. lhs 의 결과가 0과 비교하여 같지 않으면, rhs 는 전혀 평가되지 않습니다 (이른바 단락 평가 )

#include <stdbool.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main(void)
{
    bool b = 2+2 == 4 || 2+2 == 5; // true
    printf("true or false = %s\n", b ? "true" : "false");
    // logical OR can be used simialar to perl's "or die", as long as rhs has scalar type
    fopen("test.txt", "r") || printf("could not open test.txt: %s\n", strerror(errno));
}

가능한 출력:

true or false = true
could not open test.txt: No such file or directory

참고문헌

  • C11 표준 (ISO/IEC 9899:2011):
  • 6.5.3.3 단항 산술 연산자 (p: 89)
  • 6.5.13 논리 AND 연산자 (p: 99)
  • 6.5.14 논리 OR 연산자 (p: 99)
  • C99 표준 (ISO/IEC 9899:1999):
  • 6.5.3.3 단항 산술 연산자 (p: 79)
  • 6.5.13 논리 AND 연산자 (p: 89)
  • 6.5.14 논리 OR 연산자 (p: 89)
  • C89/C90 표준 (ISO/IEC 9899:1990):
  • 3.3.3.3 단항 산술 연산자
  • 3.3.13 논리 AND 연산자
  • 3.3.14 논리 OR 연산자

참조 항목

연산자 우선순위

일반 연산자
대입 증가
감소
산술 논리 비교 멤버
접근
기타

a = b
a + = b
a - = b
a * = b
a / = b
a % = b
a & = b
a | = b
a ^ = b
a <<= b
a >>= b

++ a
-- a
a ++
a --

+ a
- a
a + b
a - b
a * b
a / b
a % b
~a
a & b
a | b
a ^ b
a << b
a >> b

! a
a && b
a || b

a == b
a ! = b
a < b
a > b
a <= b
a >= b

a [ b ]
* a
& a
a - > b
a. b

a ( ... )
a, b
( type ) a
a ? b : c
sizeof


_Alignof
(C11부터)
(C23까지)

alignof
(C23부터)

참고 항목

C++ 문서 for 논리 연산자