2013-06-17 2 views
18

나는이 C++ 프로그램을 작성했으며, 왜 cout 세 번째 문구에 1이 인쇄되어 있는지 이해할 수 없다.bool = true 일 때 보완 연산자가 작동하지 않는 이유는 무엇입니까?

#include<iostream> 

using namespace std; 

int main() 
{ 
    bool b = false; 
    cout << b << "\n"; // Print 0 
    b = ~b; 
    cout << b << "\n"; // Print 1 
    b = ~b; 
    cout << b << "\n"; // Print 1 **Why?** 
    return 0; 
} 

출력 :

0 
1 
1 

는 당신은 아마이 작업을 수행 할 수

0 
1 
0 
+6

왜 누군가가 투표를 종료하는지 알지 못합니다. – vikiiii

+1

+1 @vikiiii - 유감스럽게도, downvoting과 투표 마감은 stackexchange의 약점이며 익명으로 발생하기 때문에 믿습니다. – Sabuncu

+1

그래서 기본적으로 잘못된 연산자를 사용하여 왜 예상하지 못했는지 궁금합니다. – szx

답변

24

이것은 C 레거시 운영자 기계화 때문입니다 (~비트이면 보완 임). ~에 대한 정수 피연산자는 연산을 수행하기 전에 int로 승격 된 다음 bool으로 다시 변환됩니다. 그래서 당신이 얻는 것은 (부호없는 32 비트 표현을 사용하는) false ->0 ->0xFFFFFFFF ->true입니다. 그런 다음 true ->1 ->0xFFFFFFFE ->1 ->true입니다.

! 연산자가 부울 값을 반전하려고합니다.

+1

하지만 왜 거짓은 진실로 작동합니까? – vikiiii

+9

false는 unsigned int를 사용하여'0x0000'으로 표현되기 때문에, true는 다른 것일 수 있습니다. – JBL

5

인쇄되지 않는 이유 : 논리적 부정이다

b = !b; 

. 당신이 한 것은 정수로 캐스팅 된 bool의 비트 부정입니다. 두 번째로 문 b = ~b;이 실행되면 b의 이전 값은 true입니다. 정수로 변환하면 비트 보완이 -21이되므로 bool true으로 다시 캐스트됩니다. 따라서, true의 값은 true이고, false 값은 true입니다. 이는 C 레거시 때문입니다.

2

이진수가 아닌 논리 연산자를 사용해야합니다. ~ 대신 !을 사용하십시오.

5

다른 모든 사람들이 말했듯이 보완 연산자가 작업을 완료하기 전에 bool이 정수로 승격됩니다. ~는 비트 연산자이므로 정수의 각 비트를 반전시킵니다. ~을 00000001에 적용하면 결과는 11111110입니다. 이것을 32 비트 부호있는 정수에 적용하면 ~ 1에 -2가 제공됩니다. 이유가 혼란 스럽다면 바이너리 변환기를 살펴보십시오. 수정 된 질문에 http://www.binaryconvert.com/result_signed_int.html?decimal=045050

: 예를 들어

위와 같은 이유로 실제 작품 거짓

. 00000000 (32 비트로 나옴)을 뒤집 으면 11111111이됩니다. 정수로 -1이라고 생각합니다. 부울 값을 비교할 때 -not-0 인 것은 true이고 0은 단독 false입니다.

관련 문제