2016-07-14 29 views
7

Ich bin verwirrt über sizeof Operator in C.Verwirrung über sizeof Operator in C

#include <stdio.h> 

int main(void) 
{ 
    char num1=1, num2=2, result; 
    result = num1 + num2; 
    printf("Size of result: %d \n",sizeof result); 
    printf("Size of result: %d \n",sizeof(num1+num2)); 
} 

Die Ergebnisse sind 1 bzw. 4. Warum passiert das?

+0

'sizeof (num1 + num2)' ist logisch falsch. – i486

+3

@ i486 Was meinst du? – Jin

+0

@jwqwerty: Nicht logisch falsch, aber nutzlos, da Sie die Größe eines temporären Objekts erhalten, das nur für die Dauer der Größenbestimmung existiert. Im täglichen Gebrauch suchen Sie nach "sizeof (num1) + sizeof (num2)", wenn Sie z. möchte Speicherplatz zuweisen, um die Daten zu serialisieren. –

Antwort

4

result ist von char Typ, daher sizeof schenkt 1 während num1+num2 zu int Art gefördert und deshalb gibt es 4 (Größe int).

Beachten Sie, dass, wenn eine arithmetische Operation an einem Typ kleiner als die int und all seinen Wert kann durch int dann dargestellt durchgeführt werden, führen zu int Art gefördert werden.

+0

Warum wird num1 + num2 zum int-Typ hochgestuft? – Jin

+0

@ jwqwerty; Wegen der arithmetischen Operation. – haccks

+0

@ hackcks3 Dann denke ich in der Zeile "Ergebnis = num1 + num2", num1 + num2 sollte auch nach int hochgestuft werden, weil es arithmetische Operation beinhaltet? – Jin

3

num1 + num2 immer ganze Zahl ist und daher ist der Ausgang 4 während char Ergebnis ist die ausgibt 1.

Diesen Artikel beziehen Integer Promotion:

Wenn ein int alle Werte der darstellen kann Originaltyp, der Wert ist konvertiert zu einem int; Andernfalls wird es in einen unsigned int konvertiert. Diese werden als ganzzahlige Werbeaktionen bezeichnet. Alle anderen Typen sind unverändert durch die Ganzzahlspromotions.

5

TL; DR Antwort:

  • sizeof result ist die gleiche wie sizeof(char).
  • sizeof(num1+ num2) ist das gleiche wie sizeof (int)warum?

In Ihrem Fall erzeugen sie 1 (Standard garantiert) und 4 (kann variieren), respectively.

Das heißt, sizeof ein Ergebnis vom Typ erzeugt size_t, so sollten Sie %zu Formatspezifizierer den Wert zu drucken.


Warum:

Zuerst für den Additionsoperator + unter Angabe C11, Kapitel §6.5.6

Wenn beide Operanden haben arithmetischen Typ, die üblichen arithmetischen Umwandlungen durchgeführt werden, auf sie.

In Bezug auf üblichen arithmetischen Umwandlungen, §6.3.1.8/p1

[....] Ansonsten sind die integer Promotions auf beiden Operanden durchgeführt. [...

]

und dann von §6.3.1.1,/p2,

Wenn ein int alle Werte der Vorlagenart darstellen kann (wie durch die Breite beschränkt, für eine Bitfeld), der Wert wird in eine int umgewandelt; Andernfalls wird es in eine unsigned int konvertiert. Diese werden Integer-Promotionen genannt.

So ist sizeof(num1+num2) das gleiche wie sizeof(int).

0

Die Größe eines Zeichens beträgt 1 Byte, ein Zeichen kann Werte bis 127 (vorzeichenlos bis 255) enthalten. Wenn Sie etwas wie (a + b) sagen, wird eine temporäre Variable erstellt und verwendet, um a zu b hinzuzufügen, da a und b nur 127 enthalten können, werden sie vom Compiler als int deklariert, um sicher zu gehen.

was logisch ist, denn wenn a = 100 und b = 100, möchte der Benutzer 200 sehen, wenn er sie addiert und nicht 73 (was das Ergebnis eines Überlaufs ist).