Jak przenośna jest ta konwersja. Czy mogę być pewien, że oba stwierdzenia przejdą?
int x = 4<5;
assert(x==1);
x = 4>5;
assert(x==0);
Nie pytaj dlaczego. Wiem, że to brzydkie. Dziękuję Ci.
Jak przenośna jest ta konwersja. Czy mogę być pewien, że oba stwierdzenia przejdą?
int x = 4<5;
assert(x==1);
x = 4>5;
assert(x==0);
Nie pytaj dlaczego. Wiem, że to brzydkie. Dziękuję Ci.
assert( 4 < 5);
iassert(!( 4 > 5));
(4 < 5) ? 1 : 0
gdybym naprawdę musiał przekonwertować wartość logiczną na 0 lub 1. Dobry kompilator prawdopodobnie wyprodukuje ten sam kod maszynowy i będzie bardziej przejrzysty dla ludzkiego czytelnika.
Odpowiedzi:
int x = 4<5;
Całkowicie przenośny. Zgodny z normą. bool
do int
konwersji jest niejawna!
§4.7 / 4 ze standardu C ++ mówi ( konwersja integralna )
Jeśli typ źródła to bool, wartość
false
jest konwertowana na zero, a wartośćtrue
jest konwertowana na jeden .
Jeśli chodzi o C, o ile wiem, nie ma to bool
w C. (przed 1999), więc bool
do int
konwersji jest istotne tylko w C ++. W C, 4<5
zwraca int
wartość, w tym przypadku wartość jest 1
, 4>5
zostanie oszacowana do 0
.
EDYCJA: Jens w komentarzu powiedział, C99 ma _Bool
typ. bool
to makro zdefiniowane w stdbool.h
pliku nagłówkowym. true
i false
są również zdefiniowane w makr w stdbool.h
.
§7.16 z C99 mówi:
Makro
bool
rozwija się do _Bool.[..],
true
która jest interpretowana jako stała całkowita1
,false
która jest interpretowana jako stała całkowita0
, [..]
bool
w C od 1999 roku. Po prostu użyj nagłówka „stdbool.h” i powinien on zostać uwzględniony.
bool
/ _Bool
typ, operatorów relacyjnych w C produktów int
, nie bool
. To znaczy, nawet w C99 operatory relacyjne nadal produkują int
.
Oznaczyłeś swoje pytanie [C] i [C ++] w tym samym czasie. Wyniki będą spójne dla wszystkich języków, 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 bool
(dotyczy to również C99). W języku C operatory relacyjne nie dają bool
wyników. Oba 4 > 5
i 4 < 5
są wyrażeniami, które generują wyniki typu int
z wartościami 0
lub 1
. Tak więc w przykładach w C. nie ma żadnego „konwersji bool na int”.
W C ++ operatory relacyjne rzeczywiście dają bool
wyniki. bool
wartości są konwertowane na int
typ, z true
konwertowaniem na 1
i false
konwertowaniem na 0
. Gwarantuje to język.
Język PS C ma również dedykowany typ boolowski _Bool
(makro-aliasowany as bool
), a jego integralne reguły konwersji są zasadniczo takie same jak w C ++. Niemniej jednak nie dotyczy to twoich konkretnych przykładów w C. Po raz kolejny operatory relacyjne w C zawsze dają int
(nie bool
) wyniki, niezależnie od wersji specyfikacji języka.
bool
w C99, operatory relacyjne nadal produkują int
w C99, nie bool
. Tak więc, jeśli interesują cię operatory relacyjne (jak w twoich przykładach), problem nadal nie ma nic wspólnego bool
.
int
, a nie bool
. Nie dochodzi do konwersji.
bool
ale nie pozwala na pobranie jego adresu? Wiele systemów wbudowanych wykorzystuje tego typu typy (często deklarowane za pomocą identyfikatora bit
). Na przykład na PIC średniego zasięgu if (bitVar1) bitVar2=1;
byłyby dwie instrukcje; optymalne kodowanie if (byteVar1) byteVar2=1;
to co najmniej cztery (w wielu kompilatorach prawdopodobnie pięć). Takie typy mogą zatem zapewnić znaczny wzrost wydajności.
Sekcja 6.5.8.6 normy C mówi:
Każdy z operatorów <(mniejszy niż),> (większy niż), <= (mniejszy lub równy) i> = (większy lub równy) daje 1, jeśli określona relacja jest prawdą i 0, jeśli jest false.) Wynik ma typ int.
Wydaje się, że nie ma problemu, ponieważ rzutowanie int na bool jest wykonywane niejawnie. Działa to w kompilatorze Microsoft Visual C ++, GCC i Intel C ++. Żaden problem ani w C, ani w C ++.
assert(x!=0)
. Nawet jeśli bool (true) konwertuje portable na int (1), potwierdzenie „not false” ma bardziej czytelne wyrażenie.