Dimensione del carattere ('a') in C / C ++


298

Qual è la dimensione del carattere in C e C ++? Per quanto ne so, la dimensione del carattere è di 1 byte in C e 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 danno 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 a 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;
}

Produzione:

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;
}

Produzione:

Size of char : 1
Size of char : 1

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


8
Il "%|"formato richiede un intargomento (o qualcosa che promuove int). sizeofproduce un risultato di tipo size_t. Converti in intun cast o, se l'implementazione lo supporta, usa "%zu".
Keith Thompson,

Risposte:


348

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


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

14
+1 (Ad eccezione del fatto che, sebbene la "dimensione di 4" si applichi ovviamente alla piattaforma di nthrgeek, non si applica necessariamente a tutte le piattaforme.)
sbi

28
@nthrgeek: Sono troppo pigro per citare entrambi gli standard, ma lo standard C ++ ha un'appendice dedicata alle incompatibilità con C. Nell'Appendice C.1.1, si menziona che "Il tipo di carattere letterale è cambiato da inta char, il che spiega il comportamento. :)
jalf

3
@nthrgeek: §6.4.4.4, paragrafo 10: "Una costante di carattere intero ha tipo int. Il valore di una costante di carattere intero che contiene un singolo carattere mappato a un carattere di esecuzione a byte singolo è il valore numerico della rappresentazione del mappato carattere interpretato come intero. "
Stephen Canon,

7
@nthrgeek: non dovresti chiedere un riferimento standard a meno che tu non abbia una discussione su un punto specifico e desideri capire perché l'altra persona ha un'opinione diversa. Se tutti sono d'accordo, accettalo. Tu (come sviluppatore) dovresti essere abbastanza intelligente da trovare rapidamente una risposta comune come questa da solo.
Martin York,

26

Come affermato da Paul, è perché 'a'è un intin C ma un charin C ++.

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


4
Solo curioso, ma stai lavorando per aggiornare quel documento (molto dettagliato) per includere le nuove modifiche in C ++ 11 e C11?
Adam Rosenfield,

Non al momento. Il mio interesse per C e C ++ è diminuito molto negli ultimi cinque anni circa.
David R Tribble,

3
Uh, ho usato il tuo lavoro per scrivere questo ed eccoti qui su SO. Un mondo così piccolo!

17

In C il tipo di caratteri letterali sono int e char in C ++. Questo è in C ++ richiesto per supportare il sovraccarico delle funzioni . Vedi questo esempio:

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

Produzione:

char

5

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

Quindi, la dimensione del carattere letterale è uguale alla dimensione del numero intero in C.

Nel linguaggio C ++ , il carattere letterale è di tipo char. Il cppreference dice:

1) carattere stretto letterale o carattere ordinario letterale, ad es. 'a'Oppure '\n'oppure '\13'. Tale letterale ha tipochar e valore pari alla rappresentazione di c-char nel set di caratteri di esecuzione. Se c-char non è rappresentabile come singolo byte nel set di caratteri di esecuzione, il valore letterale ha tipo int e valore definito dall'implementazione.

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

Alos, nei tuoi programmi hai utilizzato un identificatore di formato errato per l' sizeofoperatore.

C11 §7.21.6.1 (P9):

Se una specifica di conversione non è valida, il comportamento non è definito.275) Se qualsiasi argomento non è del tipo corretto per la specifica di conversione corrispondente, il comportamento non è definito.

Quindi, dovresti usare l' %zuidentificatore di formato invece di %d, altrimenti è un comportamento indefinito in C.


%zunon è supportato su molte piattaforme, ma portabilità, utilizzo (int)sizeof(char)e formato %d
migliori

Il valore dei caratteri letterali non è necessariamente il corrispondente codice ASCII. Dipende dai set di caratteri di origine e di esecuzione e se il chartipo è firmato o non firmato per impostazione predefinita.
Chqrlie,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.