Programing

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

crosscheck 2020. 8. 2. 17:26
반응형

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


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


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

true == 1

통합 프로모션이 적용되고 부울 가치가로 승격되며이 int프로모션은 1을 산출해야합니다.

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


찰스 베일리의 대답은 맞습니다. C ++ 표준의 정확한 표현은 (§4.7 / 4)입니다. "소스 유형이 부울 인 경우 false 값은 0으로 변환되고 true 값은 1로 변환됩니다."

편집 : 그가 참조를 추가 한 것을 알았습니다. 산만하지 않고 잊어 버리지 않으면 곧 삭제하겠습니다.

Edit2 : 그런 다음 부울 값 자체는 항상 0 또는 1로 변환되는 반면 많은 함수 (특히 C 표준 라이브러리에서)는 "기본적으로 부울"이지만 값은 ints로 표시됩니다. 일반적으로 false를 나타내려면 0 만, true를 나타내려면 0이 아니어야합니다. 예를 들어, is * 함수는 <ctype.h>0 또는 0이 아닌 0 만 필요하면됩니다.

로 캐스팅하면 bool0은 false로 변환되고 0이 아닌 값은 true로 변환됩니다.


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

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

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


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

참고 URL : https://stackoverflow.com/questions/2725044/can-i-assume-booltrue-int1-for-any-c-compiler

반응형