제어문, 연산자 및 부울 유형과 같은 많은 다른 것들을 혼합하고 있습니다. 각각 고유 한 규칙이 있습니다.
제어 문은 예를 들어 ifC11 6.4.8.1 문과 같이 작동합니다 .
두 형식 모두식이 0과 같지 않은 경우 첫 번째 하위 문이 실행됩니다.
while, for등 같은 규칙을 가지고있다. 이것은 "true"또는 "false"와는 관련이 없습니다.
부울 결과를 산출하는 것으로 추정되는 연산자는 실제로 int값이 1 또는 0 인을 산출하고 있습니다. 예를 들어 같음 연산자, C11 6.5.9 :
각 연산자는 지정된 관계가 참이면 1을, 거짓이면 0을 산출합니다.
위의 모든 것은 C가 1999 년까지 부울 유형을 가지지 않았기 때문이며, 하나를 얻었더라도 위의 규칙은 변경되지 않았습니다. 따라서 명령문과 연산자가 부울 유형 (예 : C ++ 및 Java)을 생성하는 대부분의 다른 프로그래밍 언어와는 달리 int값이 0이거나 0이 아닌를 생성합니다. 예를 들어, sizeof(1==1)C에서는 4를, C ++에서는 1을 제공합니다.
C의 실제 부울 유형은 명명 _Bool되며 최신 컴파일러가 필요합니다. 헤더 stdbool.h를 정의 매크로 bool, true과 false에 확장 _Bool, 1및 0(C ++과의 호환성을 위해) 각각.
그러나 제어문과 연산자를 실제로 부울 유형이 필요하거나 산출 한 것처럼 처리하는 것은 좋은 프로그래밍 관행으로 간주됩니다. MISRA-C와 같은 특정 코딩 표준은 이러한 방법을 권장합니다. 그건:
if(ptr == NULL)대신 if(ptr).
if((data & mask) != 0)대신 if(data & mask).
이러한 스타일의 목표는 정적 분석 도구를 사용하여 유형 안전성을 높이고 버그를 줄이는 것입니다. 이 스타일은 정적 분석기를 사용하는 경우에만 의미가 있습니다. 어떤 경우에는 더 읽기 쉽고 자체 문서화 코드로 이어지지 만 예를 들어
if(c == '\0')
좋습니다. 의도는 명확하고 코드는 자체 문서화입니다.
대
if(c)
나쁜. 무엇이든 의미 할 수 c있으며 코드를 이해하려면 유형을 찾아야 합니다. 정수, 포인터 또는 문자입니까?