C ++ 사양은 다음을 정의합니까?
- 부울 매개 변수에 대해 ‘보다 작음’연산자의 존재
- 4 개의 매개 변수 순열의 결과?
즉, 다음 작업의 결과가 사양에 정의되어 있습니까?
false < false
false < true
true < false
true < true
내 설정 (Centos 7, gcc 4.8.2)에서 아래 코드는 내가 기대하는 것을 뱉어냅니다 (C가 C를 사용하여 false를 0으로, true를 1로 표시 한 경우).
false < false = false
false < true = true
true < false = false
true < true = false
나는 대부분의 (모든?) 컴파일러가 동일한 출력을 줄 것이라고 확신하지만, 이것이 C ++ 사양에 의해 제정되어 있습니까? 또는 난독 처리가되었지만 사양 호환 컴파일러에서 true가 false보다 작다고 결정할 수 있습니까?
#include <iostream>
const char * s(bool a)
{
return (a ? "true" : "false");
}
void test(bool a, bool b)
{
std::cout << s(a) << " < " << s(b) << " = " << s(a < b) << std::endl;
}
int main(int argc, char* argv[])
{
test(false, false);
test(false, true);
test(true, false);
test(true, true);
return 0;
}
답변
TL; DR :
작업은 C ++ 표준 초안에 따라 잘 정의되어 있습니다.
세부
우리는로 이동하여 그것을 볼 수 있습니다 표준 ++ 초안 C 섹션 5.9
관계 연산자 (라고 강조 광산 향후 ) :
피연산자는 산술 가져야한다 , 열거 또는 포인터 유형 , 또는 형식 표준 : nullptr_t합니다. 연산자 <(보다 작음),> (보다 큼), <= (보다 작거나 같음) 및> = (보다 크거나 같음)은 모두 거짓 또는 참입니다. 결과의 유형은 부울입니다
부울은 3.9.1 기초 유형의 산술 유형입니다.
유형 에서 bool , 문자, char16_t, char32_t, wchar_t를, 그리고 서명 및 부호없는 정수 유형은 공동으로하는
통합 유형을했다.
과
정수 및 부동 유형을 통칭하여 산술 유형이라고합니다.
및 true
및 false
에서 부울 리터럴 2.14.6
부울 리터럴 :
boolean-literal:
false
true
5.9
관계 연산자의 역학을 더보기 위해 섹션 으로 돌아가서 다음과 같이 말합니다.
일반적인 산술 변환은 산술 또는 열거 유형의 피연산자에서 수행됩니다.
일반적인 산술 변환이 섹션에 설명되어 있습니다 5
밝히는 :
그렇지 않으면 적분 프로모션 (4.5)이 두 피연산자 모두에서 수행됩니다.
섹션 4.5
은 말합니다 :
bool 유형의 prvalue는 int 유형의 prvalue로 변환 될 수 있으며, false는 0이되고 true는 1이됩니다.
그래서 표현은 :
false < false
false < true
true < false
true < true
이 규칙을 사용하면 다음과 같습니다.
0 < 0
0 < 1
1 < 0
1 < 1
답변
와 부울 값은 보통의 정수 프로모션이 적용됩니다 false
로 정의 0
하고 true
정의 1
. 모든 비교가 잘 정의되어 있습니다.
답변
C ++ 표준 (5.9 관계 연산자)에 따름
2 일반적인 산술 변환은 산술 또는 열거 유형의 피연산자에서 수행됩니다.
과
1 … 결과의 유형은 부울입니다.
(3.9.1 기본 유형)
6 bool 유형의 값은 true 또는 false입니다 .49 [참고 : 부호있는, 부호없는, 짧은 또는 긴 bool 유형 또는 값은 없습니다. — 끝 주]
bool 유형의 값은 통합 프로모션 (4.5)에 참여 합니다.
(4.5 통합 프로모션)
6 bool 유형의 prvalue는 int 유형의 prvalue로 변환 될 수 있으며, false는 0이되고 true는 1이 됩니다.
따라서 모든 예제에서 true는 int 1로 변환되고 false는 int 0으로 변환됩니다
이 표현들
false < false
false < true
true < false
true < true
전적으로
0 < 0
0 < 1
1 < 0
1 < 1
답변
부울 false
은에 해당 int 0
하고 부울 true
은에 해당합니다 int 1
. 그래서 이것은 false < true
== 식 0 < 1
만이를 반환하는 유일한 이유를 설명 합니다 true
.