2014-09-06 3 views
1

TRUE/FALSE은 일반적으로 C에서 다음과 같이 정의됩니다. 이 정의는 컴파일러 구현에 따라 지원되는 C 표준의 일부입니까?C 표준의 TRUE/FALSE 부분입니까?

#define TRUE 1 
#define FALSE 0 
+1

http://en.wikipedia.org/wiki/De_facto_standard –

+1

@MarkRansom : 거의 없습니다. 일부 (IMO, 스타일이 매우 나쁜) C 코드는 이와 같은 매크로를 사용합니다.그러나 그것은 보편적 인 것이 아닙니다. 그리고 그들이 기본적으로 정의한 유일한 곳은 모든 종류의 비표준 파일과 임의의 임베디드 시스템을위한 다양한 저품질 컴파일러 등을 가진 특정 Windows 컴파일러입니다 :-) –

답변

8

아니요, TRUE 또는 FALSE은 아니요. <stdbool.h>을 포함하는 경우 C99 이상의 truefalse의 예입니다.

+0

편집자 : 처음에 해냈어. – Enumy

0

C99 및 C11은 _Bool이라는 부울 의미론이있는 정수 유형을 정의하지만 실제로 true/false 키워드는 없습니다.

_Bool 유형 값 1과 0이 1로 변환되고, 0 인 비교하지 않는 값을 저장하기 만 할 수 있고, 비교 값은 0과 동일는 0.

로 변환되고 <stdbool.h>을 포함하여 _Bool 유형은 다른 언어와 마찬가지로 bool으로 쓰여질 수 있으며 truefalse C 전 처리기 매크로는 각각 1과 0으로 정의됩니다. 누군가가 때때로

#define TRUE 1 
#define FALSE 0 
typedef char BOOL; /* or #define BOOL char */ 

또는 C99 달리

typedef enum {False, True} BOOL; 

같은 상수를 정의하는

그 전에, 그러나, 모두가 편리 다소이었다 적어도 하나의 결함 :

BOOL bClicked = False; 

++bClicked, ++bClicked; 

if (bClicked == False) 
    printf ("False\n"); 
else if (bClicked == True) 
    printf ("True\n"); 
else 
    printf ("Unknown: %d\n", bClicked); 

정의 된 BOOL 유형이 아니기 때문에 "알 수 없음 : 2"가 인쇄됩니다. 진정한 Boolean 타입.

C99 버전 :

_Bool은 그래서 1을 증가 저장 0과 1, 1

에서 0 같지 않은 비교 2, 결과를 얻을 수 있기 때문에 "참"인쇄됩니다
_Bool bClicked = 0; 

++bClicked, ++bClicked; 

if (bClicked == 0) 
    printf ("False\n"); 
else if (bClicked == 1) 
    printf ("True\n"); 
else 
    printf ("Unknown: %d\n", bClicked); 

물론

, 대부분의 사람들은 실제로 참/거짓 상수에 대해 비교하기보다는 자신의 장점 언어를 사용

if (bClicked) 
    { 
    /* True if bClicked does not compare equal to 0 */ 
    } 
else 
    { 
    /* False */ 
    } 

을 그 때문에 B의 사실, 부울 유형 또는 참/거짓 상수에 대한 실제 필요는 없습니다. 그들은 의도의 표시를 위해 순전히 존재한다.

왠지 마지막에 같은 단순 비교 했어야 값을 반환에도 불구하고 사람이 일부 Windows API 함수 유형 BOOL의 값을 반환한다는 불평하지만, TRUEFALSE이 유일하게 가능한 반환 값하지 않았다, 그래서 기억

가능한 모든 경우를 처리하기 위해서는 더 많은 비교가 필요했습니다. 당시의 실제 Boolean 유형이 있었다면, 그 함수는 무엇이든간에 int 유형의 값을 리턴했을 것입니다. BOOL 반환 유형은 두 개의 값만 반환 할 수 있음을 나타내지 만 세 번째 (오류) 반환 값이 있었기 때문에 해당 함수의 경우와 다를 수 있습니다.

관련 문제