bool에서 int로 변환 될 수 있습니까? int x = 4<5; assert(x==1); x =

이 전환은 얼마나 휴대하기 쉬운가. 두 어설 션이 모두 통과 될 수 있습니까?

int x = 4<5;
assert(x==1);

x = 4>5;
assert(x==0);

이유를 묻지 마십시오. 나는 그것이 추악하다는 것을 알고 있습니다. 감사합니다.



답변

int x = 4<5;

완전히 휴대 가능합니다. 표준 준수. boolint변환 암시입니다!

C ++ 표준의 4.7 / 4에 따르면 (통합 변환 )

소스 유형이 부울 인 경우 값 false이 0 true으로 변환되고이 1로 변환됩니다 .


C에 관해서는, 지금까지의 내가 아는 한 전혀 없다 bool그래서 (1999 이전) C.에 boolint의 변환은 C ++에 관련된다. C에서, 4<5평가 int값은 값이이 경우에 1, 4>5 로 평가 것입니다 0.

편집 : 의견에 Jens는 C99 _Bool유형 이 있다고 말했다 . 헤더 파일에 bool정의 된 매크로 stdbool.h입니다. truefalse도에 정의 된 매크로입니다 stdbool.h.

C99의 7.16에서는

매크로 bool가 _Bool로 확장됩니다.

[…] true정수 상수로 확장하는 1, false
정수 상수에 전개 0[…]


답변

질문 [C]와 [C ++]에 동시에 태그를 지정했습니다. 결과는 언어간에 일관성이 있지만 대답의 구조는 각 언어마다 다릅니다.

C 언어에서 귀하의 예제는 boolC99에도 적용되는 것과 관련이 없습니다 . C 언어에서 관계 연산자는 bool결과를 생성하지 않습니다 . 모두 4 > 54 < 5유형의 결과를 생산 표현식 int0또는 1. 따라서 C의 예제에서 발생하는 “bool에서 int 로의 변환”은 없습니다.

C ++에서 관계 연산자는 실제로 bool결과를 생성 합니다. bool값하는 컨버터블 int함께 입력 true으로 변환 1하고 false으로 변환 0. 이것은 언어에 의해 보장됩니다.

PS C 언어에는 전용 부울 형식 _Bool(으로 매크로 앨리어싱 bool)이 있으며 기본 변환 규칙은 기본적으로 C ++에서와 동일합니다. 그러나 그럼에도 불구하고 이것은 C의 특정 예제와 관련이 없습니다. 다시 한 번 C의 관계 연산자 는 언어 사양의 버전에 관계없이 항상 결과를 생성 int하지 않습니다 bool.


답변

C 표준의 섹션 6.5.8.6은 다음과 같이 말합니다.

<(보다 작음),> (보다 큼), <= (보다 작거나 같음) 및> = (보다 크거나 같음) 각각의 연산자는 지정된 관계가 참이면 1을, 그렇지 않으면 0을 산출합니다. false.) 결과는 int 유형입니다.


답변

int bool cast가 내재적으로 수행되므로 문제가없는 것 같습니다. 이것은 Microsoft Visual C ++, GCC 및 Intel C ++ 컴파일러에서 작동합니다. C 또는 C ++에서 문제가 없습니다.


답변