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 de char est de 1 octet en C et c++.

C:

#include <stdio.h>
int main()
{
  printf("Size of char : %dn",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

Maintenant, nous savons que les caractères sont représentés en 'a' , 'b' , 'c' , '|' ,... Donc je viens de modifier les codes ci-dessus pour ceci:

C:

#include <stdio.h>
int main()
{
  char a = 'a';
  printf("Size of char : %dn",sizeof(a));
  printf("Size of char : %dn",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 le sizeof('a') renvoie des valeurs différentes en C et C++?

260
demandé sur MD XF 2010-01-31 22:15:20

4 réponses

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épendante 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 langues.

294
répondu Eric Postpischil 2013-12-09 18:02:11

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

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

25
répondu David R Tribble 2012-08-13 19:42:36

En C le type de caractères littéraux sont int et char en C++. C'est dans C++ requis pour la surcharge de la fonction de soutien . Voir cet exemple:

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

sortie:

char
14
répondu Smith 2016-08-20 07:41:12

dans la langue C , le caractère littéral n'est pas un type char . C considère le caractère littéral comme entier. Il n'y a donc pas de différence entre sizeof('a') et sizeof(1) .

ainsi, la taille du caractère littéral est égale à la taille de l'entier en C.

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

1) caractère étroit littéral ou caractère ordinaire littéral, p.ex. 'a' ou '\n' ou '' . Tel littéral a le type char et la valeur égale à représentation de C-char dans le jeu de caractères d'exécution. Si c-char est pas représentable comme un seul octet dans l'exécution de jeu de caractères, les literal a type int et implementation-defined value.

donc, en C++ caractère littéral est un type de char . ainsi, la taille du caractère littéral en C++ est un octet.

Alos, dans vos programmes, vous avez utilisé le mauvais spécificateur de format pour l'opérateur sizeof .

C11 §7.21.6.1 (P9):

si une spécification de conversion est invalide, le comportement est indéterminé.275) si un argument n'est pas le type correct pour le correspondant spécification de conversion, le comportement n'est pas défini.

ainsi, vous devez utiliser %zu spécificateur de format au lieu de %d , sinon c'est un comportement non défini en C.

4
répondu rsp 2017-11-01 11:20:25