web-dev-qa-db-fra.com

Taille du caractère ('a') en C / C ++

Quelle est la taille du caractère en C et C++? Pour autant que je sache, la taille d'un caractère est de 1 octet en C et C++.

En C:

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

En C++:

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

Pas de surprises, les deux donnent le résultat: Size of char : 1

Nous savons maintenant que les caractères sont représentés sous la forme 'a', 'b', 'c', '|', ... Je viens donc de modifier les codes ci-dessus:

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

Sortie:

Size of char : 1
Size of char : 4

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

Sortie:

Size of char : 1
Size of char : 1

Pourquoi la sizeof('a') renvoie-t-elle des valeurs différentes en C et C++?

283
whacko__Cracko

En C, le type d'un caractère constant comme 'a' est en fait un int, avec une taille de 4 (ou une autre valeur dépendant de l'implémentation). En C++, le type est char, avec une taille de 1. C'est l'une des nombreuses petites différences entre les deux langages.

323
anon

Comme Paul l'a dit, c'est parce que 'a' est une int en C mais une char en C++.

Je couvre cette différence spécifique entre C et C++ dans quelque chose que j'ai écrit il y a quelques années à l'adresse suivante: http://david.tribble.com/text/cdiffs.htm

25
David R Tribble

En C, le type de littéral de caractère est int et char en C++. Ceci est requis en C++ pour surcharge de la fonction de support. Voir cet exemple:

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

Sortie:

char
16
Smith

En langage C , le caractère littéral n'est pas un type char. C considère que le caractère littéral est un entier. Donc, il n'y a pas de différence entre sizeof('a') et sizeof(1).

Ainsi, le littéral de taille sizeof est égal à sizeof de nombre entier en C.

En langage C++ , le littéral de caractère est le type de char. Le cppreference dit:

1) littéral de caractère étroit ou littéral de caractère ordinaire, par ex. 'a' ou '\n' ou '\13'. Ce type de littéral a le type char et la valeur égale à la représentation de c-char dans le jeu de caractères d'exécution. Si c-char n'est pas représentable sous la forme d'un seul octet dans le jeu de caractères d'exécution, le littéral a le type int et la valeur définie par l'implémentation.

Ainsi, en C++, le littéral caractère est un type de char. La taille du caractère littéral en C++ est donc d'un octet.

De plus, dans vos programmes, vous avez utilisé un spécificateur de format incorrect pour l'opérateur sizeof.

C11 §7.21.6.1 (P9):

Si une spécification de conversion est invalide, le comportement est indéfini.275) Si l'un des arguments n'est pas du type correct pour la spécification de conversion correspondante, le comportement est indéfini.

Donc, vous devriez utiliser le spécificateur de format %zu au lieu de %d, sinon c'est un comportement indéfini en C.

5
msc