In Bezug auf den Booleschen Typ in C.
Ein boolescher Typ wurde ziemlich spät in der C-Sprache eingeführt, im Jahr 1999. Zuvor hatte C keinen booleschen Typ, sondern wurde int
für alle booleschen Ausdrücke verwendet. Daher geben alle logischen Operatoren wie > == !
etc einen int
Wert von 1
oder zurück 0
.
Es war für Anwendungen üblich, hausgemachte Typen wie zu verwenden typedef enum { FALSE, TRUE } BOOL;
, die sich auch auf int
Typen in Größengröße beschränken.
C ++ hatte einen viel besseren und expliziten booleschen Typ bool
, der nicht größer als 1 Byte war. Während die booleschen Typen oder Ausdrücke in C im schlimmsten Fall als 4 Bytes enden würden. In C wurde eine gewisse Kompatibilität mit C ++ mit dem C99-Standard eingeführt. C bekam dann einen booleschen Typ _Bool
und auch den Header stdbool.h
.
stdbool.h
bietet einige Kompatibilität mit C ++. Dieser Header definiert das Makro bool
(gleiche Schreibweise wie das C ++ - Schlüsselwort), das erweitert _Bool
wird. Dieser Typ ist ein kleiner Ganzzahltyp, wahrscheinlich 1 Byte groß. In ähnlicher Weise enthält der Header zwei Makros true
und die false
gleiche Schreibweise wie C ++ - Schlüsselwörter, jedoch mit Abwärtskompatibilität zu älteren C-Programmen . Daher true
und false
erweitern Sie zu 1
und 0
in C und deren Typ ist int
. Diese Makros sind nicht vom booleschen Typ, wie es die entsprechenden C ++ - Schlüsselwörter wären.
In ähnlicher Weise aus Gründen der Abwärtskompatibilität, logische Operatoren in C noch zurückkehren ein int
bis heute, obwohl heutzutage C einen Booleschen Typ bekam. In C ++ geben logische Operatoren a zurück bool
. Ein Ausdruck wie sizeof(a == b)
gibt also die Größe von a int
in C an, aber die Größe von a bool
in C ++.
In Bezug auf den bedingten Operator ?:
Der bedingte Operator ?:
ist ein seltsamer Operator mit ein paar Macken. Es ist ein häufiger Fehler zu glauben, dass es zu 100% äquivalent zu ist if() { } else {}
. Nicht ganz.
Es gibt einen Sequenzpunkt zwischen der Auswertung des 1. und des 2. oder 3. Operanden. Es ?:
wird garantiert, dass der Operator nur den 2. oder 3. Operanden auswertet, sodass er keine Nebenwirkungen des Operanden ausführen kann, die nicht ausgewertet werden. Code wie true? func1() : func2()
wird nicht ausgeführt func2()
. So weit, ist es gut.
Es gibt jedoch eine spezielle Regel, die besagt, dass der 2. und 3. Operand implizit vom Typ heraufgestuft und mit den üblichen arithmetischen Konvertierungen gegeneinander abgewogen werden müssen . ( Implizite Typ-Promotion-Regeln in C hier erklärt ). Dies bedeutet, dass der 2. oder 3. Operand immer mindestens so groß wie ein ist int
.
Es spielt also keine Rolle true
und ist false
zufällig vom Typ int
in C, da der Ausdruck immer mindestens die Größe eines int
Egal ergibt .
Selbst wenn Sie den Ausdruck neu schreiben würden, würde er immer noch die Größe eines !sizeof(a ? (bool)true : (bool)false)
int
Dies liegt an der impliziten Typwerbung durch die üblichen arithmetischen Konvertierungen.
sizeof(true)
undsizeof(false)
ist auch 4: ide.geeksforgeeks.org/O5jvuN