2016-02-09 6 views
8

Was wird printf auf den Bildschirm schreiben?Warum gibt sizeof (char + char) 4 zurück?

Ich dachte, weil sizeof (char) = 1, dass sizeof (a + b) auch 1 ist, aber es stellte sich heraus 4. Ich verstehe das nicht, warum schreibt es 4, wenn wir hinzufügen zwei Zeichen?

+0

Was erwarten Sie? Was haben Sie über den Operator 'sizeof' gelesen? –

+0

Ich erwartete, dass es zurückgibt 1. Ich weiß, dass es die Größe eines Typs oder einer Variablen in Bytes zurückgibt, genauer gesagt die Anzahl der Zeichen, die dort passen. – Nebeski

+0

'a + b' ist eine ganzzahlige Auswertung. –

Antwort

12

in C-Sprache-Operanden von fast alle arithmetischen Operatoren sind implizite Konvertierungen üblichen arithmetischen Umwandlungen unterworfen genannt oder, in diesem Fall integer aktionen. Operanden vom Typ char werden zum Typ int befördert, und die tatsächliche Addition wird innerhalb der Domäne int (oder unsigned int, abhängig von den Eigenschaften von char auf dieser Plattform) ausgeführt. So wird Ihr a + b tatsächlich als (int) a + (int) b interpretiert. Das Ergebnis hat den Typ int und sizeof(int) ist anscheinend 4 auf Ihrer Plattform. Das ist was du siehst.

Und verwenden Sie nicht %d zu printf das Ergebnis sizeof. Das Ergebnis sizeof hat den Typ size_t, während %d ein int Argument erfordert. Also, entweder den richtigen Formatspezifizierer

printf("%zu\n", sizeof(a+b)); 

oder zumindest werfen das Argument, wenn Sie sicher sind, passt es

printf("%d\n", (int) sizeof(a+b)); 
+0

Noch nie von _integral Promotions_ gehört. – chux

+0

@chux - es ist der alte C90 Begriff - der formale Standardbegriff ist ganzzahlige Werbung. Siehe [hier] (http://stackoverflow.com/questions/12094412/what-is-the-difference-between-integral-promotion-and-balancing-in-c) und [hier] (http: // stackoverflow. com/questions/10660758/integral-promotion) für mehr – Krease

+0

@Chris Ich sehe: -> "Integral Promotions" ist der alte C90 Begriff, der formale Standardbegriff ist Integer-Promotions. – chux

6

Dies ist nicht das gleiche wie sizeof(char), das Argument (dh das Ergebnis der Zusatz) wird zu int hochgestuft, also ist sizeof(a + b) tatsächlich äquivalent zu sizeof(int). Wenn Sie das Ergebnis in char umwandeln, wird es sein, was Sie erwarten. Auch der korrekte Formatbezeichner für sizeof Ergebnis, das ist size_t ist %zu und nicht %d.

Versuchen

printf("%zu", sizeof((char) (a + b)));