2013-05-07 5 views
8
#include <stdio.h> 
int main()   
{ 

      short int i = 20; 

      char c = 97; 

      printf("%d, %d, %d\n", sizeof(i), sizeof(c), sizeof(c + i)); 
      return 0; 
} 

Könnte jemand mir sagen, was passiert, wenn sizeof (a + b) "a short int Typ & b ist char-Typ" Ausgang ist: 2, 1, 4Was passiert hier? sizeof (short_int_variable + char_Variable)

+0

'sizeof 'ist ein Kompilierzeit-Konstrukt. –

+0

Größe des Ergebnisses berechnet als int – BLUEPIXY

+0

Sie haben noch nicht erwähnt, dass die Größe von (c + c) auch 4 ergibt, also wird sizeof (c/2) oder sizeof (1998) – Kartikya

Antwort

8

Aufgrund der C-Standard integral promotion rules, die Art des Ausdrucks c + iint ist, so dass, warum bist du immer das Äquivalent von sizeof (int).

Beachten Sie, dass sizeof keine Funktion ist, die Klammern werden nur benötigt, wenn ein Typ and to resolve precendence conflicts benannt wird. Ihr Code coule geschrieben werden:

printf("%zu, %zu, %zu\n", sizeof i, sizeof c, sizeof (c + i)); 

Die endgültige Verwendung von sizeof Klammern hat seit sizeof fester bindet als +, sagen sizeof c + i als (sizeof c) + i analysiert werden würde, die nicht das gewünschte Ergebnis.

Beachten Sie auch, dass es ein Kompilierzeitkonstrukt die meiste Zeit ist, der Ausdruck wird nie tatsächlich ausgewertet. Alles, was passiert, ist, dass der Compiler "vorgibt", ihn auszuwerten, den Typ des Ausdrucks herauszufinden und Ihnen dann die Größe eines Wertes dieses Typs zu geben. Der tatsächliche Wert muss nie existieren, was manchmal ordentlich ist.

Der Typ des durch sizeof zurückgegebene Wert ist size_t, die %zu gedruckt wird (es ist nicht int).

+0

Um Verwechslungen zu vermeiden, setzen Sie, wie Sie bereits an anderer Stelle angegeben haben, immer ein Leerzeichen zwischen "sizeof" und der öffnenden Klammer. (Ich mache diese witzige Konvention nur für den Leser explizit) – Rerito

+1

der Code sollte 'printf ("% zu,% zu,% zu \ n ", sizeof i, sizeof c, sizeof (c + i));' weil ['sizeof' gibt kein' int' zurück] (https://stackoverflow.com/q/940087/995714) –

+0

@ LưuVĩnhPhúc Absolut, danke für die Korrektur dieser alten Antwort. Bearbeitet natürlich. – unwind

0

sizeof funktioniert nur bei compiletime, um die Größe eines Ausdrucks zu erhalten.

Im folgenden werden nicht tatsächlich erhöhen 'c':

c = sizeof (++ c);

Der Ausdruck sizeof (a + b) wird die größte Art mit unsigned mit Vorrang Rück

4
1) sizeof(i) ==> sizeof(short int) = 2 

2) sizeof(c) ==> sizeof(char) = 1 

3) sizeof(c + i [97+20]) ==> sizeof(int) = 4 // result in constant value which is int as default 
+0

downvotter. Bitte erläutern Sie, was ich falsch verstehe? Ich werde mich korrigieren .. – Mani

+0

* "Ergebnis in konstanten Wert, der int als Standard ist" * - Huh? Ich verstehe nicht einmal, wovon du sprichst. –

+0

@ChristianRau Ich spreche über '(c + i)', was zu einem konstanten Wert führt, der standardmäßig als 'int' angenommen wird. – Mani

0

Der Datentyp von a ist "short int". -32768 ~ +32767

Der Datentyp von c ist "char". 0 ~ 255

Wenn Sie ein in den c es ist auch nicht short int noch char wird es int!

Hier ist ein Beispiel-Code, der Ihnen helfen, den variablen Datentyp zu erhalten:

#include <typeinfo> 

int main() 
{ 
    short int a = 1; 
    char c = 'A'; 
    std::cout << typeid(a + c).name() << std::endl; 

    return 1; 
} 
+0

Ein 'short' hat den Bereich -32768 bis 32767. – Lindydancer

+0

Sie haben Recht ... Ich habe einen Fehler gemacht. –

1

Wie andere gesagt haben, sizeof zur Compile-Zeit berechnet wird.

Hier Wert des Ausdrucks c + i integer, als c und i (Integral Förderung) gefördert werden int und somit

sizeof(c + i) 

gibt Ihnen 4 Bytes auf 32-Bit-Maschine ..