Program Tip

이 경우 bool과 not bool이 모두 true를 반환하는 이유는 무엇입니까?

programtip 2020. 11. 4. 08:14
반응형

이 경우 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는 마지막 비트 만 반전하는 것처럼 보이지만 같지 않은 모든 값 0true. 이것은 논리적으로 잘못된 동작으로 이어집니다. 구현상의 결함입니까, 아니면 사양이이를 허용합니까? (가) 있습니다 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)

참고 URL : https://stackoverflow.com/questions/23268357/why-does-bool-and-not-bool-both-return-true-in-this-case

반응형