2013-06-17 7 views
18

Napisałem ten program w C++ i nie jestem w stanie zrozumieć, dlaczego w trzecim oświadczeniu cout drukuje 1.Dlaczego operator dopełniania nie działa, gdy 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; 
} 

wyjściowa:

0 
1 
1 

Dlaczego nie drukuje

0 
1 
0 
+6

Naprawdę nie wiem, dlaczego ktoś głosuje zamknąć. – vikiiii

+1

+1 @vikiiii - Niestety, przegłosowanie i głosowanie na zakończenie to słabe punkty stosu zmian, uważam, że dzieje się to w sposób anonimowy. – Sabuncu

+1

Więc w zasadzie używasz niewłaściwego operatora i zastanawiasz się, dlaczego daje ci to, czego się nie spodziewałeś? – szx

Odpowiedz

24

Jest to spowodowane mechanizacją operatora C (również przypominając, że ~ jest bitowe dopasowanie). Zintegrowane operandy do ~ są promowane do int przed wykonaniem operacji, a następnie przekształcane z powrotem do bool. Tak więc to, co dostajesz, jest efektywne (przy użyciu niepodpisanej reprezentacji 32-bitowej). false ->0 ->0xFFFFFFFF -> . Następnie true ->1 ->0xFFFFFFFE ->1 ->true.

Szukasz operatora ! do odwrócenia wartości boolowskiej.

+1

Ale dlaczego fałszywa prawda działa, a nie odwrotnie? – vikiiii

+9

Ponieważ wartość false jest reprezentowana jako '0x0000' przy użyciu unsigned int, a true może być cokolwiek innego. – JBL

5

Prawdopodobnie chcesz to zrobić:

b = !b; 

co jest logiczną negację. To, co zrobiłeś, to bitowe negowanie rzutowania na liczbę całkowitą. Po drugim wykonaniu instrukcji b = ~b; poprzednia wartość b to true. Rzucane na liczbę całkowitą daje to 1, którego dopełnienie bitowe wynosi -2, a zatem odsyła się z powrotem do bool true. Dlatego true wartości b pozostaną true, a wartości zostaną przypisane true. Jest to spowodowane dziedzictwem C.

2

Należy używać operatorów logicznych, a nie binarnych. Użyj ! zamiast ~.

5

Jak prawie wszyscy inni stwierdzili, bool jest promowany na liczbę całkowitą, zanim operator dopełnienia wykona swoją pracę. ~ jest operatorem bitowym, a zatem odwraca każdy pojedynczy bit liczby całkowitej; jeśli zastosujesz ~ do 00000001, wynikiem jest 11111110. Kiedy zastosujesz to do 32-bitowej liczby całkowitej ze znakiem, ~ 1 daje -2. Jeśli jesteś zdezorientowany, dlaczego, wystarczy spojrzeć na konwerter binarny. Na przykład: http://www.binaryconvert.com/result_signed_int.html?decimal=045050

do swojego zmienionego pytanie:

false na true prac z tego samego powodu jak wyżej. Jeśli odwrócisz 00000000 (obecnie do 32 bitów), otrzymasz 11111111 ... co moim zdaniem wynosi -1 w liczbie całkowitej. Porównując wartości logiczne, wszystko, co jest -nie-0, jest uważane za prawdziwe, podczas gdy 0 jest fałszywe.