2013-04-12 17 views
9

ho scritto un piccolo printf che sta lavorando diverso in C e C++:fa il lavoro di operatore sizeof diverso in C andd C++

int i; 
    printf ("%d %d %d %d %d \n", sizeof(i), sizeof('A'), sizeof(sizeof('A')), sizeof(float), sizeof(3.14)); 

L'uscita per il programma di cui sopra in C usando il compilatore gcc è 4 4 8 4 8

l'uscita del suddetto programma in C++ utilizzando compilatore g ++ è 4 1 8 4 8

I prevede 4 1 4 4 8 in c. Ma il risultato non è così.

Il terzo parametro nel sizeof printf (sizeof ('A')) sta dando 8

Qualcuno mi può dare la motivazione per questo

+0

vs2012: '' 4 1 4 4 8''. – gongzhitaao

risposta

14

Non ha nulla a che fare con l'operatore sizeof in particolare; piuttosto, la dimensione dei caratteri letterali in C è diversa da C++, perché i caratteri letterali in C sono di tipo int, mentre in C++ sono di tipo char.

Vedere Why are C character literals ints instead of chars? per ulteriori informazioni.

+0

Grazie per la risposta. Perché sizeof (3.14) richiede 8 byte. 3.14 è a destra. –

+5

No, è un doppio. 3.14f è un galleggiante. – Throwback1986

2

Come spiegato in Size of character ('a') in C/C++:

In C, char è un byte, ma 'a' è una costante int quindi è (nel tuo caso, a seconda dell'architettura che si compila!) Quattro byte di larghezza. in C++, sia char e 'a' sono char con una dimensione di byte.

Il messaggio più importante è che C++ non è un superset di C. Ha molte piccole modifiche di interruzione come questa.

+2

'int' non deve essere quattro byte. – chris

+0

@chris Aggiunta una nota – Patashu

+0

Grazie Ho chiesto la domanda in base all'ultima citazione menzionata da voi. C++ è superset di C –

3

Sì, è specifico per l'implementazione. sizeof() restituisce size_t che è un numero intero senza segno. La sua dimensione dipende dalla macchina (32-bit vs 64-bit) e anche dall'implementazione.