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 : 0gdybym 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ą. booldo intkonwersji jest niejawna!
§4.7 / 4 ze standardu C ++ mówi ( konwersja integralna )
Jeśli typ źródła to bool, wartość
falsejest konwertowana na zero, a wartośćtruejest konwertowana na jeden .
Jeśli chodzi o C, o ile wiem, nie ma to boolw C. (przed 1999), więc booldo intkonwersji jest istotne tylko w C ++. W C, 4<5zwraca intwartość, w tym przypadku wartość jest 1, 4>5 zostanie oszacowana do 0.
EDYCJA: Jens w komentarzu powiedział, C99 ma _Booltyp. boolto makro zdefiniowane w stdbool.hpliku nagłówkowym. truei falsesą również zdefiniowane w makr w stdbool.h.
§7.16 z C99 mówi:
Makro
boolrozwija się do _Bool.[..],
truektóra jest interpretowana jako stała całkowita1,falsektóra jest interpretowana jako stała całkowita0, [..]
boolw C od 1999 roku. Po prostu użyj nagłówka „stdbool.h” i powinien on zostać uwzględniony.
bool/ _Booltyp, 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ą boolwyników. Oba 4 > 5i 4 < 5są wyrażeniami, które generują wyniki typu intz wartościami 0lub 1. Tak więc w przykładach w C. nie ma żadnego „konwersji bool na int”.
W C ++ operatory relacyjne rzeczywiście dają boolwyniki. boolwartości są konwertowane na inttyp, z truekonwertowaniem na 1i falsekonwertowaniem 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.
boolw C99, operatory relacyjne nadal produkują intw 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.
boolale 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.