“false <true”작업이 올바르게 정의되어 있습니까? 정의합니까? 부울 매개 변수에 대해 ‘보다 작음’연산자의

C ++ 사양은 다음을 정의합니까?

  1. 부울 매개 변수에 대해 ‘보다 작음’연산자의 존재
  2. 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를, 그리고 서명 및 부호없는 정수 유형은 공동으로하는
통합 유형을했다.

정수 및 부동 유형을 통칭하여 산술 유형이라고합니다.

truefalse에서 부울 리터럴 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.


답변