2012-07-25 5 views
21

Eventuali duplicati:
Size of character ('a') in C/C++Perché l'uscita di questo programma è diversa tra C e C++?

Il seguente programma

#include <stdio.h> 

int main() 
{ 
    printf("%d\n", sizeof('\0')); 
    printf("%d\n", sizeof(0)); 
} 

compilato con uscite gcc

4 
4 

e spirito h g ++

1 
4 

Perché sta succedendo? So che non è una cosa da compilatore ma una differenza tra C e C++ ma qual è la ragione?

+25

Altro come _language_-dependent! – Shahbaz

+0

Perché stavi facendo questo, in primo luogo, per curiosità? – Aerovistae

risposta

35

In C, carattere costanti di hanno tipo int per 6.4.4.4 (10) dello standard, costante carattere

Un numero intero ha tipo int. Il valore di una costante di carattere intero contenente un singolo carattere associato a un carattere di esecuzione a byte singolo è il valore numerico della rappresentazione del carattere mappato interpretato come un numero intero.

Così si stampa la dimensione di un int due volte.

In C++, le costanti di caratteri hanno il tipo char.

12

Il \0 carattere letterale è trattato come un int in C, quindi in realtà si finisce per la stampa sizeof(int) invece di sizeof(char).

ideone fornisce gli stessi risultati (C, C++).

+1

@Konrad, true, tutto più piccolo di un 'int' è considerato come un' int' in C. Risolto. –

+0

No, anche questo non è vero, non * tutto * è trattato come 'int', solo caratteri letterali: http://ideone.com/ZQIPC –

+0

@Konrad, il test' short' nell'esempio usa un cast.Naturalmente, non c'è modo di esprimere un letterale 'short', quindi anche un valore che si adatta a un' short' viene analizzato come un 'int' dall'inizio. In effetti, sarebbe interessante sapere se un letterale "short" sarebbe trattato allo stesso modo di uno "char" ... –

4

In caratteri C i letterali sono inti. In C++ sono caratteri.

0

L'output è già dipendente dal compilatore poiché si utilizza l'identificatore di formato errato per size_t, ovvero %zu. Sui sistemi a 64 bit con size_t più largo di int questo potrebbe fornire qualsiasi tipo di immondizia.

Altrimenti questo shure dipende dal compilatore. Entrambi i valori di cui si tenta di stampare le dimensioni sono int in C e char e int in C++. Quindi in C questo di solito dovrebbe darti 4 4 o 8 8 e in C++ 1 4 o 1 8.