konwersja bool na int

Jak przenośna jest ta konwersja. Czy Mogę być pewien, że oba twierdzenia przechodzą?

int x = 4<5;
assert(x==1);

x = 4>5;
assert(x==0);
Nie pytaj dlaczego. Wiem, że to brzydkie. Dziękuję.
 95
Author: pic11, 2011-03-20

4 answers

int x = 4<5;
Całkowicie przenośny. Zgodny ze standardem. bool do int Konwersja jest niejawna!

§4.7 / 4 ze standardu C++ mówi (Integral Conversion)

Jeśli typem źródłowym jest bool, wartość false jest zamienione na zero i wartość true jest konwertowane na jeden .


Jeśli chodzi o C, O ile wiem, nie ma bool W C. (Przed 1999) więc Konwersja bool do int jest istotna tylko w C++. W C, 4<5 ocenia do int wartości, w tym przypadku wartość jest 1, 4>5 by ocenić do 0.

EDIT: Jens w komentarzu powiedział, że C99 ma typ _Bool. bool jest makrem zdefiniowanym w pliku nagłówkowym stdbool.h. true i {[3] } są również makrami zdefiniowanymi w stdbool.h.

§7.16 z C99 mówi,

Makro bool rozszerza do _Bool.

[..] true który rozszerza się do stałej całkowitej1, false który rozszerza się do liczby całkowitej stała 0,[..]

 155
Author: Nawaz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-12 08:57:16

Otagowałeś swoje pytanie [C] i [c++] w tym samym czasie. Wyniki będą spójne między językami, ale struktura odpowiedzi jest inna dla każdego z tych języków.

W języku C twoje przykłady nie mają żadnego związku z bool w ogóle (dotyczy to również C99). W języku C operatory relacyjne nie generują bool wyników. Zarówno 4 > 5, jak i 4 < 5 są wyrażeniami, które dają wyniki typu int o wartościach 0 lub 1. Więc nie ma " bool to int nawrócenie " dowolnego rodzaju zachodzącego w Twoich przykładach w C.

W C++ operatory relacyjne rzeczywiście wytwarzają bool wyniki. bool wartości są zamieniane na typ int, z true konwersją na 1 i false konwersją na 0. Gwarantuje to język.

P. S. język C ma również dedykowany Typ boolean _Bool (makro-aliased jako bool), a jego integralne reguły konwersji są zasadniczo takie same jak w C++. Niemniej jednak nie jest to istotne dla Twojego po raz kolejny operatory relacyjne w C zawsze dają int (Nie bool) wyniki niezależnie od wersji specyfikacji języka.

 39
Author: AnT,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-20 18:08:17

Sekcja 6.5.8.6 normy C mówi:

Każdy z operatorów (większe niż), = (większe lub równe) daje 1 jeżeli określony relation is true and 0 if it is fałsz.) Wynik ma typ int.

 17
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-20 16:34:32

Wydaje się, że nie ma problemu, ponieważ odlewanie INT to bool jest wykonywane bezwarunkowo. Działa to w kompilatorze Microsoft Visual C++, GCC i Intel C++. Nie ma problemu w C lub c++.

 2
Author: Alex James,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-20 17:08:52