Logical operators
논리 연산자는 피연산자에 표준 불리언 대수 연산을 적용합니다.
| 연산자 | 연산자 이름 | 예시 | 결과 |
|---|---|---|---|
| ! | 논리 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
|
+
a
|
!
a
|
a
==
b
|
a
[
b
]
|
a
(
...
)
|
참고 항목
|
C++ 문서
for
논리 연산자
|