이 전환은 얼마나 휴대하기 쉬운가. 두 어설 션이 모두 통과 될 수 있습니까?
int x = 4<5;
assert(x==1);
x = 4>5;
assert(x==0);
이유를 묻지 마십시오. 나는 그것이 추악하다는 것을 알고 있습니다. 감사합니다.
답변
int x = 4<5;
완전히 휴대 가능합니다. 표준 준수. bool
로 int
변환 암시입니다!
C ++ 표준의 4.7 / 4에 따르면 (통합 변환 )
소스 유형이 부울 인 경우 값
false
이 0true
으로 변환되고 값 이 1로 변환됩니다 .
C에 관해서는, 지금까지의 내가 아는 한 전혀 없다 bool
그래서 (1999 이전) C.에 bool
로 int
의 변환은 C ++에 관련된다. C에서, 4<5
평가 int
값은 값이이 경우에 1
, 4>5
로 평가 것입니다 0
.
편집 : 의견에 Jens는 C99 _Bool
유형 이 있다고 말했다 . 헤더 파일에 bool
정의 된 매크로 stdbool.h
입니다. true
및 false
도에 정의 된 매크로입니다 stdbool.h
.
C99의 7.16에서는
매크로
bool
가 _Bool로 확장됩니다.[…]
true
정수 상수로 확장하는1
,false
정수 상수에 전개0
[…]
답변
질문 [C]와 [C ++]에 동시에 태그를 지정했습니다. 결과는 언어간에 일관성이 있지만 대답의 구조는 각 언어마다 다릅니다.
C 언어에서 귀하의 예제는 bool
C99에도 적용되는 것과 관련이 없습니다 . C 언어에서 관계 연산자는 bool
결과를 생성하지 않습니다 . 모두 4 > 5
와 4 < 5
유형의 결과를 생산 표현식 int
값 0
또는 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 ++에서 문제가 없습니다.