이 경우 bool과 not bool이 모두 true를 반환하는 이유는 무엇입니까?
이 질문에 이미 답변이 있습니다.
이것은 내 코드입니다.
#include <cstring>
#include <iostream>
int main() {
bool a;
memset(&a, 0x03, sizeof(bool));
if (a) {
std::cout << "a is true!" << std::endl;
}
if (!a) {
std::cout << "!a is true!" << std::endl;
}
}
다음을 출력합니다.
a is true!
!a is true!
의 !
연산자 bool
는 마지막 비트 만 반전하는 것처럼 보이지만 같지 않은 모든 값 0
은 true
. 이것은 논리적으로 잘못된 동작으로 이어집니다. 구현상의 결함입니까, 아니면 사양이이를 허용합니까? (가) 있습니다 memset
생략 할 수 있으며, 행동이 것이 아마 때문에 동일 a
메모리 쓰레기가 포함되어 있습니다.
나는 gcc 4.4.5를 사용하고 있으며 다른 컴파일러는 다르게 할 수 있습니다.
표준 (3.9.1 / 6 기본 유형)은 다음과 같이 말합니다.
bool 유형의 값은 true 또는 false입니다.
....
초기화되지 않은 자동 객체의 값을 검사하는 것과 같이이 국제 표준에서 "정의되지 않은"것으로 설명 된 방식으로 bool 값을 사용하면 true도 false도 아닌 것처럼 작동 할 수 있습니다.
프로그램의 사용으로 인해 memset
정의되지 않은 동작이 발생합니다. 그 결과 값이 참도 거짓도 아닐 수 있습니다.
그것은 "논리적으로 잘못된 것"이 아니라 정의되지 않은 행동입니다. bool
두 값 중 하나를 포함하도록되어 true
또는 false
. 여기에 값을 할당하면 이러한 값 중 하나로 변환됩니다. 메모리 위에 임의의 바이트 값을 작성하여 유형 안전성을 깨뜨리는 것은 (또는 언급했듯이 inintialised하지 않은 채로 두는 것) 그렇지 않으므로 true
또는 false
.
내부적으로는 비트 not ( ~
연산자)을 사용하여 반전시킬 가능성이 있으며, bool이 0이거나 모두 1 일 때 작동합니다.
a = 00000000 (false)
!a = 11111111 (true)
그러나 3으로 설정하면 :
a = 00000011 (true)
!a = 11111100 (also true)
'Program Tip' 카테고리의 다른 글
“미해결 포함 : (0) | 2020.11.04 |
---|---|
CSV 파일을 Pandas DataFrame으로 가져 오기 (0) | 2020.11.04 |
Android에서 데이터 바인딩을 사용하여 ImageView의 android : src에서 드로어 블 리소스 ID 설정 (0) | 2020.11.04 |
Bitmap.Clone ()과 새 Bitmap (Bitmap)의 차이점은 무엇입니까? (0) | 2020.11.03 |
OWIN HttpListener를 찾을 수 없습니다. (0) | 2020.11.03 |