Odnośnie typu boolowskiego w C
Typ boolowski został wprowadzony dość późno w języku C, w roku 1999. Wcześniej C nie posiadał typu boolowskiego, ale zamiast tego był używany intwe wszystkich wyrażeniach boolowskich. Dlatego wszystkie operatory logiczne, takie jak > == !etc zwracają intwartość 1lub 0.
Niestandardowe było, aby aplikacje korzystały z typów domowych, takich jak typedef enum { FALSE, TRUE } BOOL;, co również sprowadza się do inttypów o dużych rozmiarach.
C ++ miał znacznie lepszy i jawny typ boolowski bool, który nie był większy niż 1 bajt. Podczas gdy typy boolowskie lub wyrażenia w C w najgorszym przypadku miałyby 4 bajty. Pewien sposób na kompatybilność z C ++ został wprowadzony w C ze standardem C99. C otrzymał wtedy typ boolowski, _Boola także nagłówek stdbool.h.
stdbool.hzapewnia pewną zgodność z C ++. Ten nagłówek definiuje makro bool(taka sama pisownia jak słowo kluczowe w C ++), które rozwija się do _Bool, typ, który jest typem małej liczby całkowitej, prawdopodobnie o rozmiarze 1 bajtu. Podobnie, nagłówek zawiera dwa makra truei false, tak samo jak C ++ pisowni słów kluczowych, ale z wstecznej kompatybilności dla starszych programów C . Dlatego truei falserozwinąć do 1iw 0C, a ich typ to int. Te makra nie są w rzeczywistości typu boolowskiego, jak odpowiadałyby im słowa kluczowe C ++.
Podobnie, dla celów zgodności z poprzednimi wersjami, operatory logiczne w C nadal zwracają an intdo dnia dzisiejszego, mimo że C obecnie ma typ boolowski. W C ++ operatory logiczne zwracają plik bool. Zatem wyrażenie takie jak sizeof(a == b)da rozmiar litery intw C, ale rozmiar a boolw C ++.
Odnośnie operatora warunkowego ?:
Operator warunkowy ?:jest dziwnym operatorem z kilkoma dziwactwami. Powszechnym błędem jest przekonanie, że jest to równoważne w 100% if() { } else {}. Nie do końca.
Istnieje punkt sekwencji między obliczeniem pierwszego i drugiego lub trzeciego operandu. ?:Operator gwarantuje jedynie oceniać albo 2 lub 3rd argumentu, więc nie może wykonywać żadnych skutków ubocznych argumentu, który nie jest uwzględniany. Kod taki jak true? func1() : func2()nie będzie wykonywany func2(). Na razie w porządku.
Istnieje jednak specjalna reguła mówiąca, że drugi i trzeci operand muszą być niejawnie promowane i równoważone względem siebie za pomocą zwykłych konwersji arytmetycznych . ( Wyjaśniono tutaj niejawne reguły promocji typu w języku C ). Oznacza to, że drugi lub trzeci operand zawsze będzie co najmniej tak duży jak plik int.
Więc to nie ma znaczenia truei falsetak się składa, że jest to typ intw C, ponieważ wyrażenie zawsze podawałoby co najmniej rozmiar intnieważne.
Nawet gdybyś przepisał wyrażenie na to, nadal zwróciłoby to rozmiar !sizeof(a ? (bool)true : (bool)false) int
Dzieje się tak z powodu niejawnej promocji typu poprzez zwykłe konwersje arytmetyczne.
sizeof(true)asizeof(false)także 4: ide.geeksforgeeks.org/O5jvuN