bool에서 int로 변환


131

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

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

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

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


왜 첫 번째 표현을 바꾸지 않습니까? 당신은 쓸 수 있습니다 assert(x!=0). bool (true)가 이식성을 int (1)로 변환하더라도 "false가 아닌"어설 션은 더 읽기 쉬운 표현을 갖습니다.
harper

1
왜 : assert( 4 < 5);assert(!( 4 > 5));
마틴 뉴욕

4
@harper : 필요한 비교 표현식 값을 사용하는 것이 완벽합니다.
R .. GitHub 중지 지원 얼음

@ R._ bool-to-int 변환이 합리적인 결과를 제공하는지에 대한 의문이있을 때, 나는 이것에 의존하지 않을 것입니다. 저자가이 요구 사항이 충족되었다는 의심이 들면 독자에게 동일한 문제가 발생할 수 있습니다. 특히 x의 값은 점검 할 조건이 아니라 중간 결과 일뿐입니다.
harper

3
(4 < 5) ? 1 : 0부울을 실제로 0 또는 1로 변환해야 할 경우 아마 쓸 것입니다 . 좋은 컴파일러는 동일한 기계 코드를 생성 할 것이며 아마도 사람에게는 더 명확 할 것입니다.
ollb

답변:


205
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[...]


3
bool1999 년 이후로 C에 있는지 확인하십시오 . "stdbool.h"헤더 만 사용하면됩니다.
Jens Gustedt

1
실제로, 나는 여러 컴파일러에서 확인했으며 이식성이있는 것 같습니다.
pic11

8
에 관계없이 C 언어와의 가용성의 버전 bool/ _Bool유형, C 생산에 관계 연산자 int, 없습니다 bool. 즉, C99에서도 관계 연산자는 여전히을 생성 int합니다.
AnT

51

질문 [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.


2
맞습니다, K & R C에는 부울이 없습니다. 저는 질문을 C99로 다시 태그했습니다.
pic11

@ pic11 : 태그를 다시 지정할 필요가 없습니다. K & R 또는 다른 C와는 아무런 관련이 없습니다. boolC99에는 관계 연산자가 여전히 intC99가 아니라 C99에서 생성 됩니다 bool. 따라서 관심있는 관계 연산자 (예에서와 같이) 인 경우 문제는 여전히 관련이 없습니다 bool.
AnT

이제 알겠다. 관계 연산자의 결과는 암시 적으로 int로 변환 가능합니다. 이것은 C, C99 및 C ++에서 마찬가지입니다. 다시 타겟팅하십시오.
pic11

3
@ pic11 : 아니요, 이해가되지 않습니다. C99를 포함하여 C에서 비교 연산자의 결과는 a가 int아닌입니다 bool. 전환이 발생하지 않습니다.
R .. GitHub 중지 지원 얼음

언어가 동작 bool하지만 주소를 받아 들일 수없는 유형을 가질 수있는 표준을 준수하는 방법이 있습니까? 많은 임베디드 시스템은 이러한 유형을 사용합니다 (종종 identifier를 사용하여 선언 bit). 예를 들어 미드 레인지 PIC에서는 if (bitVar1) bitVar2=1;두 가지 명령이 있습니다. 최적의 코딩 if (byteVar1) byteVar2=1;은 최소한 4 개 (많은 컴파일러, 아마도 5 개)입니다. 따라서 이러한 유형은 성능을 크게 향상시킬 수 있습니다.
supercat

17

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

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


참조 주셔서 감사합니다. 역사적 이유로 true == 1 인 것 같습니다.
pic11

2

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


2
"어떤 경우에는 작동합니다"는 특히 도구의 지정되지 않은 버전에서 정확성을 검사하는 좋은 방법이 아닙니다. 나는 다른 답변의 접근 방식을 선호합니다. 특정 구현이 올바른지 보장 할 수는 없지만 올바른 구현이 수행하는 것을 보장 할 수 있습니다.
Matthew 읽기
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.