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ę. 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ła0
,[..]
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.
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.
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++.
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