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 intfür alle booleschen Ausdrücke verwendet. Daher geben alle logischen Operatoren wie > == !etc einen intWert von 1oder zurück 0.
Es war für Anwendungen üblich, hausgemachte Typen wie zu verwenden typedef enum { FALSE, TRUE } BOOL;, die sich auch auf intTypen 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 _Boolund auch den Header stdbool.h.
stdbool.hbietet einige Kompatibilität mit C ++. Dieser Header definiert das Makro bool(gleiche Schreibweise wie das C ++ - Schlüsselwort), das erweitert _Boolwird. Dieser Typ ist ein kleiner Ganzzahltyp, wahrscheinlich 1 Byte groß. In ähnlicher Weise enthält der Header zwei Makros trueund die falsegleiche Schreibweise wie C ++ - Schlüsselwörter, jedoch mit Abwärtskompatibilität zu älteren C-Programmen . Daher trueund falseerweitern Sie zu 1und 0in 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 intbis 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 intin C an, aber die Größe von a boolin 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 trueund ist falsezufällig vom Typ intin C, da der Ausdruck immer mindestens die Größe eines intEgal 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