programing

C/C++의 열에 주조

starjava 2023. 6. 16. 21:17
반응형

C/C++의 열에 주조

와 C할 때, C에 C++서, bool에 int스,(int)true == 1그리고.(int)false == 0반대 방향으로 캐스팅하는 게...

아래 코드에서 Visual Studio 2013 및 Keil µVision 5로 컴파일된 .c 파일에서 다음과 같은 모든 주장이 사실로 확인되었습니다.(bool)2 == true.

C와 C++ 표준은 0이 아닌 정수를 쿨에 캐스팅하는 것에 대해 어떻게 말합니까?이 동작이 지정되었습니까?인용문을 포함하십시오.

#include <stdbool.h>
#include <assert.h>

void TestBoolCast(void)
{
    int i0 = 0, i1 = 1, i2 = 2;

    assert((bool)i0 == false);
    assert((bool)i1 == true);
    assert((bool)i2 == true);

    assert(!!i0 == false);
    assert(!!i1 == true);
    assert(!!i2 == true);
}

C++ 컴파일러에 대해 (bool)true == (int)1이 중복되지 않는다고 가정할 수 있습니까?:

  1. 역방향 캐스팅 (int --> bool)
  2. 0이 아닌 값, 1이 아닌 값에 대한 논의는 없습니다.

0개의 기본 유형 값이 다음에 매핑됩니다.false.

다른 값은 다음에 매핑됩니다.true.

이 규칙은 흐름 제어 문을 통해 원래 C에서 확립되었습니다. C는 당시 부울 형식이 없었습니다.


값을 반환 값으로 가정하는 것은 일반적인 오류입니다.false실패를 나타냅니다. 하만특히나지에서.main건그입니다…false그것은 성공을 나타냅니다.저는 이것이 D 언어에 대한 윈도우 시동 코드(월터 브라이트와 안드레이 알렉산드레스쿠와 같은 사람들이 틀릴 때, 그것은 틀리기 매우 쉽습니다)를 포함하여 이것이 잘못 수행되는 것을 여러 번 보았으므로 이 경고는 주의해야 합니다.


할 필요는 bool이 변환은 암시적이기 때문에 기본 제공 형식의 경우.그러나 Visual C++(Microsoft의 C++ 컴파일러)는 이에 대해 성능 경고(!)를 실행하는 경향이 있으며, 이는 순전히 어리석은 경고입니다., 즉 그닫충않지지만분하기에전, 이부을통한환즉정중, 는스트을것캐▁aion▁via▁double▁neg즉,.return !!x잘 작동합니다.읽을 수 있습니다.!!에 대한 보상으로서.bool, 마지로가와 마찬가지로-->"수신처"로 읽을 수 있습니다. .;-)


1) C++14 §4.12/1 "0 값, null 포인터 값 또는 null 멤버 포인터 값이 다음으로 변환됩니다.false은 다른값은다로변환니다됩으로 됩니다.true은 type 직 초 화 (8.5) 경 유 의 형 pr값std::nullptr_t할 수 .bool은 결값은입니다.false.”
2) C99 및 C11 § 6.3.1.2/1 "어떤 스칼라 값이라도 다음으로 변환될 때_Bool0과 않으면는 1입니다." " " " " " 0과 0은 같고, 1과 같습니다."

다음은 C11 표준(최종 초안)을 인용한 것입니다.

6.3.1.2: 임의의 스칼라 값을 _Boole로 변환할 때, 값이 0과 동일하게 비교될 경우 결과는 0이고, 그렇지 않을 경우 결과는 1입니다.

bool(에 의해 표시됨)stdbool.h내부 명의로_BoolC) 자체는 부호 없는 정수 유형입니다.

_Boole 유형 및 표준 부호 있는 정수 유형에 해당하는 부호 없는 정수 유형은 표준 부호 없는 정수 유형입니다.

6.2.5p2에 따름:

type_Boole로 선언된 개체는 값 0과 1을 저장할 수 있을 정도로 충분히 큽니다.

AFAIK 이러한 정의는 C++와 의미적으로 동일하며, 기본 제공(!) 이름이 약간 다릅니다. boolC++ 및_BoolC를 위하여

C는 C++처럼 r 이라는 용어를 사용하지 않습니다.그러나 C에서 포인터는 스칼라이므로 포인터를 다음에 할당합니다._BoolC++에서와 같이 동작합니다.

마이크로소프트의 cl 컴파일러에 대한 C4800 경고 없이 캐스트 int > bool에 대한 일종의 오래된 '마르크스식' 방법은 부정의 부정을 사용하는 것입니다.

int  i  = 0;
bool bi = !!i;

int  j  = 1;
bool bj = !!j;

언급URL : https://stackoverflow.com/questions/31551888/casting-int-to-bool-in-c-c

반응형