2010-01-31 37 views
240

Qual è la dimensione del carattere in C e C++? Per quanto ne so, la dimensione del char è di 1 byte sia in C che in C++.Dimensioni del carattere ('a') in C/C++

In C:

#include <stdio.h> 
int main() 
{ 
    printf("Size of char : %d\n",sizeof(char)); 
    return 0; 
} 

In C++:

#include <iostream> 
int main() 
{ 
    std::cout<<"Size of char : "<<sizeof(char)<<"\n"; 
    return 0; 
} 

Nessuna sorpresa, entrambi dà l'output: Size of char : 1

Ora sappiamo che i caratteri sono rappresentati come 'a', 'b', 'c', '|', ... così si può modificare i codici di cui sopra per questi:

In C:

#include <stdio.h> 
int main() 
{ 
    char a = 'a'; 
    printf("Size of char : %d\n",sizeof(a)); 
    printf("Size of char : %d\n",sizeof('a')); 
    return 0; 
} 

Output:

Size of char : 1 
Size of char : 4 

In C++ :

#include <iostream> 
int main() 
{ 
    char a = 'a'; 
    std::cout<<"Size of char : "<<sizeof(a)<<"\n"; 
    std::cout<<"Size of char : "<<sizeof('a')<<"\n"; 
    return 0; 
} 

Output:

Size of char : 1 
Size of char : 1 

Perché i sizeof('a') restituisce diversi valori in C e C++?

+6

Il ' "% |"' formato richiede un argomento 'int' (o qualcosa che promuove a 'int'). 'sizeof' produce un risultato di tipo' size_t'. Converti in 'int' usando un cast o, se la tua implementazione lo supporta, usa' "% zu" '. –

risposta

274

In C, il tipo di carattere costante come 'a' è in realtà un int, con dimensioni di 4 (o qualche altro valore attuazione-dipendente). In C++, il tipo è char, con dimensione di 1. Questa è una delle molte piccole differenze tra le due lingue.

+0

Ok, puoi specificare il riferimento standard? :) –

+0

Questa è praticamente una risposta generica dato il codice precedente,: P – rmn

+10

Nello standard C++ è la sezione 2.13.2/1, in C 6.4.4.4, almeno nel documento che ho. –

25

Come ha affermato Paul, è perché 'a' è un int in C ma uno char in C++.

copro che differenza specifica tra C e C++ in qualcosa che ho scritto qualche anno fa, a: http://david.tribble.com/text/cdiffs.htm

+4

Solo curioso, ma stai lavorando all'aggiornamento del documento (molto dettagliato) per includere le nuove modifiche in C++ 11 e C11? –

+0

Non al momento. Il mio interesse per C e C++ è diminuito molto negli ultimi cinque anni circa. –

+2

Uh, ho usato il tuo lavoro per scrivere [questo] (http://741mhz.com/c-vs-cxx/) e qui sei su SO. Un mondo così piccolo! –

13

In C il tipo di carattere letterali sono int e char in C++. Questo è richiesto in C++ per la funzione di supporto sovraccarico. Vedere questo esempio:

void foo(char c) 
{ 
    puts("char"); 
} 
void foo(int i) 
{ 
    puts("int"); 
} 
int main() 
{ 
    foo('i'); 
    return 0; 
} 

uscita:

char 
2

Nel linguaggio C, carattere letterale non è un tipo char. C considera il carattere letterale come intero. Quindi, non c'è differenza tra sizeof('a') e sizeof(1).

Così, il carattere sizeof letterale è uguale al numero intero sizeof in C.

In C++ linguaggio, carattere letterale è di tipo char. Il cppreference esempio del:

1) stretto carattere carattere letterale o ordinaria letterale, per esempio 'a' o '\n' o '\13'. Tale letterale ha tipo char e il valore uguale alla rappresentazione di c-char nel set di caratteri di esecuzione. Se c-char è non rappresentabile come un singolo byte nel set di caratteri di esecuzione, il valore letterale ha tipo int e valore definito dall'implementazione.

Quindi, in caratteri C++ letterale è un tipo di char. quindi, la dimensione del carattere letterale in C++ è di un byte.

Alos, nei programmi è stato utilizzato un identificatore di formato errato per l'operatore sizeof.

C11 §7.21.6.1 (P9):

Se una specifica di conversione non è valida, il comportamento è undefined.275) Se uno degli argomenti non è il tipo corretto per il corrispondente conversione specifica, il comportamento non è definito.

Quindi, è necessario utilizzare %zu di formato invece di %d, altrimenti è un comportamento indefinito in C.

+0

'% zu' non è supportato su molte piattaforme, ma migliore portabilità, usa' (int) sizeof (char) 'e formatta'% d' – chqrlie

+0

Il valore dei caratteri letterali non è necessariamente il corrispondente codice ASCII. Dipende dai set di caratteri sorgente ed esecuzione e dal fatto che il tipo 'char' sia firmato o non firmato per impostazione predefinita. – chqrlie

Problemi correlati