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.