Hinzufügen von zwei bool-Werten in c / c ++

8

Ich habe versucht, den Bool-Wert zusammenzusetzen, sagen wir:

bool i = 0, j = 0, k = 0;
cout << sizeof(i + j + k) << endl;

Das Ergebnis ist 4, was bedeutet, dass das Ergebnis in einen 'int' Wert umgewandelt wird.

Ich möchte fragen: Ist das eine C / C ++ Standardoperation? garantiert der Compiler immer, dass der temporäre Wert bei Überlauf in einen größeren Typ konvertiert wird? Danke!

Danke für die Antworten, eine weitere Frage: sag, wenn ich das tue: %Code% %Code% Das Ergebnis ist 4. Warum wurde es auf "int" hochgestuft?

    
JASON 18.06.2013, 21:27
quelle

2 Antworten

16

Es ist nicht der Überlauf, der die Umwandlung verursacht, es ist die Tatsache, dass Sie überhaupt arithmetisch waren. In C ++ (und C, woher das Verhalten stammt) durchlaufen die Operanden der arithmetischen Grundoperatoren für integrierte Typen eine Reihe von klar definierten Aktionen, bevor die Berechnung durchgeführt wird. Die einfachste dieser Regeln (etwas vereinfacht) besteht darin, dass jeder Typ, der kleiner als int ist, auf int hochgestuft wird.

Ihre Folgefrage hat dieselbe Antwort - Ihr short ist kleiner als ein int , also wird sie vor dem Hinzufügen zu einem int befördert.

Diese StackOverflow-Frage enthält mehrere Antworten, in denen die Werbeaktionen beschrieben werden mehr Details.

    
Carl Norum 18.06.2013, 21:31
quelle
1

Erstens sagt sizeof Ihnen nicht, dass das Ergebnis in einen int -Wert konvertiert wird. Es ist erlaubt und in der Tat nicht ungewöhnlich, dass bool dieselbe Größe wie int hat.

Allerdings erhalten Sie hier tatsächlich int , aber das hat nichts mit den Werten zu tun (der Typ kann nicht von den Werten abhängen, weil die Werte im Allgemeinen erst zur Laufzeit bekannt sind, während der Typ beim Kompilieren bestimmt werden muss) Zeit).

Vor dem Hinzufügen werden die bool -Werte auf int hochgestuft, weil bool als Integer-Typ definiert ist und Integer-Typen, die kleiner als int all sind, hochgestuft werden zu int . Sie fügen dann drei int -Werte hinzu (eine Operation, die nicht überläuft, unabhängig davon, welche bool -Werte Sie verwenden, weil INT_MAX garantiert größer als 3 ist).

    
celtschk 18.06.2013 21:36
quelle

Tags und Links