C ++ 컴파일러에 대해 (bool) true == (int) 1이라고 가정 할 수 있습니까?


118

(bool)true == (int)1C ++ 컴파일러를 가정 할 수 있습니까 ?


3
질문의 캐스트가 중복됩니다. 되돌려 야합니까?
GManNickG

9
그는 그들 캐스트로 의미하지 않는다, 그는 의미bool t = true; int n = 1; if (t == n) {...} ;
egrunin

7
@egrunin : 어,하지만 true는 bool이고 1은 어쨌든 int입니다. :)
GManNickG

1
맞아요, 값의 유형을 말하려고했습니다.
Petruza

2
(int) true1정수 값으로,하지만 뭔가 같은 if (pointer)경우, 다음 부분을 통과 pointer != 0. 당신이 사실로 가정 할 수있는 유일한 방법은 즉 false == 0,과 true != 0(와 true평가를 1할 때 캐스팅 int)
루이스 콜로라도

답변:


134

예. 캐스트는 중복됩니다. 당신의 표현에서 :

true == 1

통합 프로모션이 적용되고 bool 값이 int 프로모션은 1을 산출해야합니다.

참조 : 4.7 [conv.integral] / 4 : 소스 유형이 bool... 인 경우 true1로 변환됩니다.


9
@Joshua : true언어로 정의 된 키워드입니다. 라이브러리에서 재정의 할 수 없습니다. #define은 키워드를 재정의 할 수 없습니다.
jalf

21
@jalf : #define은 실제로 시스템 키워드를 정의 할 수 있습니다. C 컴파일의 전처리 단계는 순전히 텍스트이며 일반적으로 키워드 나 C 구문을 알지 못합니다. 그럼에도 불구하고 언어 키워드를 재정의하는 것은 거의 항상 나쁜 생각입니다.
Dale Hagglund

2
@jalf. 그들은 아니다? gcc.gnu.org/onlinedocs/cpp/Macros.html 및 "언제 시간이 while걸리지 않습니까?"라는 질문이있는 International Obfuscated C Code Contest의 항목 중 하나 이상을 참조하십시오. (대답 다음 항목이 있다고 있기 때문에, 두 개의 매개 변수를 사용하는 경우 #definedprintf.)
켄 블룸

3
C99, §6.10.1 / 1은 "조건부 포함을 제어하는 ​​표현식은 다음을 제외하고 정수 상수 표현식이어야합니다. 직접적인 허가로 명시되지는 않았지만, 이것은 키워드와 "어휘 적으로 동일한"매크로의 가능성을 분명히 고려합니다.
Jerry Coffin

2
아, 그리고 #defines는 키워드를 재정의 할 수 있습니다. C ++ 1x는 새 키워드에 너무 많은 문제를 일으켜 요구 사항을 제거해야했습니다.
Joshua

18

Charles Bailey의 대답이 맞습니다. C ++ 표준의 정확한 표현은 (§4.7 / 4)입니다. "소스 유형이 bool이면 false 값은 0으로 변환되고 true 값은 1로 변환됩니다."

편집 : 그가 참조도 추가 한 것을 봅니다.주의가 산만 해지고 잊어 버리지 않으면 곧 삭제할 것입니다.

Edit2 : 그런 다음 부울 값 자체는 항상 0 또는 1로 변환되지만 여러 함수 (특히 C 표준 라이브러리에서)는 "기본적으로 부울"값을 반환하지만 ints로 표시된다는 점에 주목할 가치가 있습니다. 일반적으로 거짓을 나타내려면 0이고 참을 나타내려면 0이 아니어야합니다. 예를 들어의 is * 함수 <ctype.h>에는 0 또는 0이 아닌 0 만 필요하며 반드시 0 또는 1이 필요하지 않습니다.

캐스트하면 bool0이 false로 변환되고 0이 아닌 경우 true로 변환됩니다 (예상대로).


9

표준에 따르면 그 가정은 안전해야합니다. 는 C ++ bool- 유형하는 2 개 개의 값 truefalse값이 1과 0을 대응한다.

주의해야 할 것은 bool표현식과 변수를 BOOL표현식과 변수 와 혼합 하는 것 입니다. 후자는 FALSE = 0and 로 정의되며 TRUE != FALSE실제로는 0과 다른 값이 고려됨을 의미합니다 TRUE.

현대 컴파일러의 많은 실제로 암시에서 캐스팅을 시도하는 코드에 대한 경고 발급 BOOLbool경우 BOOL값이 0 또는 1 다른입니다.


3

다른 컴파일러가 사실에 대해 다른 결과를 반환하는 것을 발견했습니다. 또한 bool을 int 대신 bool과 비교하는 것이 거의 항상 더 낫다는 것을 발견했습니다. 이러한 int는 프로그램이 발전함에 따라 시간이 지남에 따라 값을 변경하는 경향이 있으며 true를 1로 가정하면 코드의 다른 곳에서 관련없는 변경에 의해 물릴 수 있습니다.


3
이것은 true정의 된 동작이있는 언어 키워드와 마찬가지로 C ++에 대한 잘못된 대답입니다 . 과 같이 일반적으로 정의 된 매크로를 참조하면 TRUE올바른 것입니다.
David Thornley

1
C 컴파일러에 대한 경험이 될 수 있습니다. 저는 수년 동안 많은 시간을 보냈습니다. if 문에서 직접 수학적 표현을 사용하는 것에 대한 나의 요점은 유효합니다. 우리는 if에서 비트 시프트가 0이 아닌지 확인하는 코드가 있었고, 다른 누군가가 0이 아닌 동일한 값을 가져와 1이라고 가정하고 물건을 날려 버렸습니다. true / 1 로의 간단한 변환은 그것을 막을 것입니다.
Michael Dorgan

저도 이런 종류의 행동을 보았습니다. 마지막으로 본 것은 1999 년경이었습니다. 저는 GCC를 사용하고있었습니다. 언어는 C였다. 그래도 나는 실제로 그런 행동을 보았다.
thb
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.