2010-11-23 3 views
10

C에서 0을 제외한 모든 양수 값은 부울 true로 처리됩니다. 그러나 부정적인 가치는 어떻습니까? 몇 가지 테스트를했는데 음수 값도 부울 true로 처리됩니다. 이것이 정의 된 행동인가 구현인가? 부울 값이 정의 되었습니까?

+0

'거짓'이 아닌 것은 모두 '사실'입니까? – khachik

+0

나는 이것을 생각한다 http://stackoverflow.com/questions/727196/boolean-true-positive-1-or-negative-1 귀하의 질문에 대한 답변을 –

답변

23

이 정의 행동 (I 질문에서 보았을 때 나는 누군가가 "true"를 1과 0으로 열거에서 "false"로 선언 추진, 이것에 대해 생각했다). 내가 어떤 스칼라 값이 _Bool로 변환되면 C99 표준 내용은 이러한

§ 6.3.1.2
으로 진술에 대해 살펴 보겠습니다 결과는 값이 0에 동일한 비교 경우 0; 그렇지 않으면 결과는 1입니다.

+2

+1 표준을 지적했다. – Jay

+0

+1 표준'bool'이 좋다. 특정 컴파일러에 C99 지원이 부족한 경우 대체 할 수있는'enum'을 사용합니다. –

1

C에서는 부울 유형이 없습니다. 부울 컨텍스트에서 0과 0.0f는 "거짓"으로 간주되고 나머지는 모두 "참"입니다.

if (2 == TRUE) 

(2 "사실"로 평가해야하지만, TRUE 1로 정의되어있는 경우 : 다음 코드는 휴식 때문에 열거에서 "사실"과 "거짓"으로 잘못 선언

두 값은 같지 않은 것으로 간주됩니다).

+1

테스트가 처음부터 이루어져서는 안되기 때문에 값이 'true'와 같으면 누구나 테스트가 잘못되었습니다. 특정 상황에서는'enum'이 문제가되지 않습니다. –

+0

C99에 부울 유형이 있습니다. 내 대답을 참조하십시오. – SiegeX

+1

여기에 익명으로 표시되었지만 열거 형을 사용하면 적절한 부울 유형처럼 보이지만 실제로는 작동하지 않습니다. 그래서 내가 처음부터 가지고 싶지 않고 대신 0과 1을 사용하는 것을 선호합니다. – tdammers

2

저는 0은 거짓이고 나머지는 사실이라고 믿습니다. 여기

참조 @ 캐스퍼의 대답은 : thread

나는 0 절대적으로 정의되며, 사실은 허위로 정의된다 거짓, 여기에 C에서 힌트를 취할 것입니다. 이것은 참의 절대 값과 비교할 때 중요한 차이입니다. 두 가지 상태 만있는 유형이 아니라면 해당 값 유형 내의 모든 값, 참, 거짓을 설명해야합니다.

2

이 C 0에, 올바른 동작 것은 거짓 및 다른 모든 C가 거짓과 다른 모든 진실한 0 정의 진정한

-1

입니다. 긍정, 부정, 뭐든간에.

은 내가 최근에 내가 그것까지 소유 것이다 typedef enum { false, true } bool;의 사용을 옹호 생각합니다. (원래 코드에 typedef이 포함되어 있지 않으면 그 부분에 대한 판단 오류입니다.) 0이 아닌 모든 값이 true이므로 다음과 같이 열거 된 bool 유형을 사용하여 옹호하지 않을 것입니다.

if(x == true) // not what you want 
if(!x == false) // works, but why so much effort? 

나는 일반적으로 논리 값에 대한 명시적인 시험을 단순히 if(x) 또는 if(!x)을 perfer. 하지만 경우에 따라서는 부울 형이하는 것이 좋다 :

bool is_something(int x) 
{ // assume for the sake of an argument that the test is reasonably complex 
    if(/* something */) return false; 
    if(/* something else */) return true; 
    return false; 
} 

이 유형 int있을 것보다 더 낫다,하지만 적어도 당신은 결과가 무엇을 의미하는지에 명시되고 있습니다.

typedef enum { false, true = !false } bool; 

내가 !가 0 또는 1을 반환 보장된다 생각하지만, 내가 잘못 될 수 있고, 또한 위의 작품 중 하나 방법 :

또한, 무엇보다도 사람에 따라 bool 더 나은이 될 수 있습니다.

+0

그냥하지 마세요. 'bool','true','false'는 "stdbool.h"에 정의되어 있습니다. –

+0

@Jens - 모든 시스템이 C99을 지원하지는 않습니다. 아마도 누군가의 컴파일러가 정말로 오래되었거나 마이크로 소프트에 의해 만들어 졌을 것입니다. 누군가가없는 경우에 대비하여 'bool' 당신은 백업을 가지고있을 수도있는 첫 번째 장소에서'bool' 타입을 사용할 것입니다. –

+0

그러면 C89에서 어떻게 예상되는지, 즉 부울 값에 대해 int를 사용하는 것이 좋습니다. 그리고 대체 파일을'bool == int','false == 0','true == 1' 매크로로 정의하는 별도의 파일로 정의하십시오. 그렇지 않으면 일단 C99 컴파일러를 사용하게되면 이것은 포트에 큰 고통이됩니다. –

관련 문제