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 int
we wszystkich wyrażeniach boolowskich. Dlatego wszystkie operatory logiczne, takie jak > == !
etc zwracają int
wartość 1
lub 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 int
typó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, _Bool
a także nagłówek stdbool.h
.
stdbool.h
zapewnia 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 true
i false
, tak samo jak C ++ pisowni słów kluczowych, ale z wstecznej kompatybilności dla starszych programów C . Dlatego true
i false
rozwinąć do 1
iw 0
C, 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 int
do 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 int
w C, ale rozmiar a bool
w 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 true
i false
tak się składa, że jest to typ int
w C, ponieważ wyrażenie zawsze podawałoby co najmniej rozmiar int
nieważ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