2016-02-09 25 views
8

Che cosa scriverà printf sullo schermo?Perché sizeof (char + char) restituisce 4?

Ho pensato perché sizeof (char) = 1, che sizeof (a + b) sarà anche 1, ma si è rivelato essere 4. Non capisco questo, perché scrive 4 se stiamo aggiungendo due caratteri?

+0

Cosa si aspetta? Che cosa hai letto sull'operatore 'sizeof'? –

+0

Mi aspettavo che restituisse 1. So che restituisce la dimensione di un tipo o una variabile in byte, più esattamente il numero di caratteri che possono esserci. – Nebeski

+0

'a + b' è una valutazione intera. –

risposta

12

In C operandi linguistiche quasi tutti gli operatori aritmetici sono sottoposti a conversioni implicite chiamati conversioni aritmetiche abituali o, in questo caso, promozioni interi. Gli operatori di tipo char vengono promossi a tipo int e l'aggiunta effettiva viene eseguita all'interno del dominio di int (o unsigned int, a seconda delle proprietà di char su quella piattaforma). Quindi il tuo a + b viene interpretato come (int) a + (int) b. Il risultato è tipo int e sizeof(int) è apparentemente 4 sulla tua piattaforma. Quel 4 è quello che vedi.

E non utilizzare %d a printf il risultato di sizeof. Il risultato di sizeof ha tipo size_t, mentre %d richiede un argomento int. Quindi, o utilizzare l'identificatore di formato corretto

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

o almeno lanciare l'argomento se si è sicuri che si adatta

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

Mai sentito parlare di _integral promozioni_. – chux

+0

@chux - è il vecchio termine C90 - il termine standard ufficiale è la promozione di interi. Vedi [qui] (http://stackoverflow.com/questions/12094412/what-is-the-difference-between-integral-promotion-and-balancing-in-c) e [here] (http: // stackoverflow. it/questions/10660758/integrale-promozione) per ulteriori – Krease

+0

@Chris Vedo: -> "Promozioni integrali" è il vecchio termine C90, il termine standard formale è la promozione di interi. – chux

6

Questo non è lo stesso di sizeof(char), l'argomento (cioè il risultato di l'aggiunta) viene promossa a int quindi sizeof(a + b) equivale di fatto a sizeof(int). Se lanci il risultato su char sarà quello che ti aspetti. Inoltre, l'identificatore di formato corretto per il risultato sizeof che è size_t è %zu e non %d.

Prova

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