C/C++ bool 타입은 type cast'에서 int로 설정했을 때 항상 0 또는 1로 보증됩니까?
많은 컴파일러가 0 또는 1만을 bool 값으로 유지하고 있는 것 같습니다만, 이것이 항상 기능하는지는 잘 모르겠습니다.
int a = 2;
bool b = a;
int c = 3 + b; // 4 or 5?
네:
C++(4 4.5/4)의 경우:
bool 유형의 r 값은 int 유형의 r 값으로 변환할 수 있으며 false는 0이 되고 true는 1이 됩니다.
C에서 값이 다음 값으로 변환되는 경우_Bool
, 0 또는 1(806.3.1.2/1)이 됩니다.
스칼라 값이 _Bool로 변환되면 값이 0과 같으면 0이 되고 그렇지 않으면 1이 됩니다.
변환 시int
꽤 간단해 int
0과 1을 유지할 수 있으므로 값에는 변화가 없습니다(제6.3.1.3항).
C/C++ 인가요?
C/C++라는 언어는 없습니다.
bool type은 type cast'에서 int로 설정했을 때 항상 0 또는 1이 보장됩니다.
C++에서는 $4.5/4 섹션은 다음과 같이 되어 있습니다.
bool 유형의 r 값은 int 유형의 r 값으로 변환할 수 있으며 false는 0이 되고 true는 1이 됩니다.
.
int c = 3 + b;
// 4 또는 5?
c 값은 4가 됩니다.
안전한 보트 밖으로 나갈 때의 또 다른 예:
bool b = false;
*(reinterpret_cast<char*>(&b)) = 0xFF;
int from_bool = b;
cout << from_bool << " is " << (b ? "true" : "false");
출력(g++(GCC) 4.4.7):
255 is true
FredOverflow의 예에 추가됩니다.
항상은 아니지만...
const int n = 100;
bool b[n];
for (int i = 0; i < n; ++i)
{
int x = b[i];
if (x & ~1)
{
std::cout << x << ' ';
}
}
시스템 출력:
28 255 34 148 92 192 119 46 165 192 119 232 26 195 119 44 255 34 96 157 192 119
8 47 78 192 119 41 78 192 119 8 250 64 2 194 205 146 124 192 73 64 4 255 34 56 2
55 34 224 255 34 148 92 192 119 80 40 190 119 255 255 255 255 41 78 192 119 66 7
8 192 119 192 73 64 240 255 34 25 74 64 192 73 64
이 이상한 출력의 이유는 표준 3.9.1 6 6에 설명되어 있습니다.
유형 값
bool
어느 쪽인가true
또는false
. 사용방법bool
초기화되지 않은 자동 객체의 값을 검사하는 등 이 국제 표준에서 "정의되지 않은" 방식으로 기술된 값은 이 객체가 또는 아닌 것처럼 동작하도록 할 수 있다.
패딩 비트가 유형에 대해 예상된 값을 유지하지 못하면 패딩 비트가 있는 유형이 이상하게 작동할 수 있습니다.대부분의 C89 실장에서는 어떤 정수형도 패딩 비트를 사용하지 않았습니다만, C99에서는 이러한 타입을 정의할 필요가 있습니다._Bool
a를 읽다_Bool
모든 비트가 0일 경우 0이 됩니다.0이 아닌 임의의 값 쓰기_Bool
읽었을 때 1이 되는 패턴으로 비트를 설정합니다.0을 쓰면 비트가 패턴(모두 비트 0일 수도 있고 아닐 수도 있음)으로 설정되며, 이 패턴은 읽었을 때 0이 됩니다.
실장 매뉴얼에 특별히 지정되어 있지 않는 한 제로 또는 제로 이외의 값을 저장함으로써 생성할 수 없었던 all-bits-zero 이외의 비트 패턴_Bool
이 기준에서는 이러한 값을 읽으려고 할 경우 어떤 일이 일어날지에 대해 언급하지 않습니다.★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
union boolChar { _Bool b; unsigned char c; } bc;
, 0 ~ 0 」의bc.c
읽습니다.bc.b
으로 하다. 하거나 1에서 0으로 저장한다.bc.b
bc.c
written면면면면면면면면면면면 which which which which which which which which which which which which which which which which 의 원인이 되는 가치관에 대하여bc.b
1.0을 하다." " 에 대한 값 :bc.c
읽습니다.bc.b
정의되지 않은 동작을 생성합니다.
C pre C99(C90 등)에는 bool 타입이 없지만 C99/C++의 bool 타입은 항상0 또는 1이 보증됩니다.
C에서는 boole 타입이 정의되어 있는지 여부에 관계없이 모든 boole 조작이0 또는 1 중 하나를 반환하는 것이 보증됩니다.
★★★★★★★★★★★★★★★★★.a && b
★★★★★★★★★★★★★★★★★」!a
★★★★★★★★★★★★★★★★★」a || b
는, 「C」의, 항상 「C 「C로 0 합니다.a
★★★★★★★★★★★★★★★★★」b
.
언급URL : https://stackoverflow.com/questions/4276207/is-c-c-bool-type-always-guaranteed-to-be-0-or-1-when-typecasted-to-int
'it-source' 카테고리의 다른 글
JAXBelement 객체를 인스턴스화하려면 어떻게 해야 하나요? (0) | 2022.12.29 |
---|---|
getc() vs fgetc() - 주요 차이점은 무엇입니까? (0) | 2022.12.29 |
Larabel 5.5 ajax 콜 419(알 수 없는 상태) (0) | 2022.12.29 |
MySQL(MariaDB) 업데이트 트랜잭션에서 '영향을 받는 0행'이 반환되는 이유는 무엇입니까? (0) | 2022.12.29 |
(테스트뿐만 아니라) 예외인 것처럼 numpy 경고를 수신하려면 어떻게 해야 합니까? (0) | 2022.12.29 |