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이 중복되지 않는다고 가정할 수 있습니까?:
- 역방향 캐스팅 (int --> bool)
- 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 "어떤 스칼라 값이라도 다음으로 변환될 때_Bool
0과 않으면는 1입니다." " " " " " 0과 0은 같고, 1과 같습니다."
다음은 C11 표준(최종 초안)을 인용한 것입니다.
6.3.1.2: 임의의 스칼라 값을 _Boole로 변환할 때, 값이 0과 동일하게 비교될 경우 결과는 0이고, 그렇지 않을 경우 결과는 1입니다.
bool
(에 의해 표시됨)stdbool.h
내부 명의로_Bool
C) 자체는 부호 없는 정수 유형입니다.
_Boole 유형 및 표준 부호 있는 정수 유형에 해당하는 부호 없는 정수 유형은 표준 부호 없는 정수 유형입니다.
type_Boole로 선언된 개체는 값 0과 1을 저장할 수 있을 정도로 충분히 큽니다.
AFAIK 이러한 정의는 C++와 의미적으로 동일하며, 기본 제공(!) 이름이 약간 다릅니다. bool
C++ 및_Bool
C를 위하여
C는 C++처럼 r 값이라는 용어를 사용하지 않습니다.그러나 C에서 포인터는 스칼라이므로 포인터를 다음에 할당합니다._Bool
C++에서와 같이 동작합니다.
마이크로소프트의 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
'programing' 카테고리의 다른 글
IPthon 노트북의 로깅 모듈에서 출력 가져오기 (0) | 2023.06.16 |
---|---|
애플리케이션을 릴리스하기 전에 NSLog를 비활성화해야 합니까? (0) | 2023.06.16 |
생성자가 서명 new와 일치하지 않습니다. (0) | 2023.06.16 |
Firebase와 함께 NodeJs 사용 - 보안 (0) | 2023.06.16 |
상위 구성 요소를 통해 pinia 저장소 액세스 (0) | 2023.06.16 |