Citations simples vs guillemets doubles en C ou C ++


Réponses:


282

En C et en C ++, les guillemets simples identifient un seul caractère, tandis que les guillemets doubles créent un littéral de chaîne. 'a'est un seul littéral de caractère, tandis que "a"est un littéral de chaîne contenant un 'a'et un terminateur nul (c'est-à-dire un tableau de 2 caractères).

En C ++, le type d'un littéral de caractère est char, mais notez qu'en C, le type d'un littéral de caractère est int, c'est-à- sizeof 'a'dire 4 dans une architecture où les entiers sont 32 bits (et CHAR_BIT est 8), tandis qu'il sizeof(char)est 1 partout.


47

Certains compilateurs implémentent également une extension, qui autorise les constantes à plusieurs caractères. La norme C99 dit:

6.4.4.4p10: "La valeur d'une constante de caractère entier contenant plus d'un caractère (par exemple, 'ab'), ou contenant un caractère ou une séquence d'échappement qui ne correspond pas à un caractère d'exécution à un octet, est définie par l'implémentation. "

Cela pourrait ressembler à ceci, par exemple:

const uint32_t png_ihdr = 'IHDR';

La constante résultante (dans GCC, qui implémente cela) a la valeur que vous obtenez en prenant chaque caractère et en le déplaçant vers le haut, de sorte que «I» se retrouve dans les bits les plus significatifs de la valeur 32 bits. Évidemment, vous ne devriez pas vous en remettre à cela si vous écrivez du code indépendant de la plate-forme.


7
Merci, je viens de voir cela dans du code et ma réponse ne peut être décrite que comme "WTF". J'utilise GCC de temps en temps depuis 15 ans et je n'ai jamais rencontré cela jusqu'à présent.
eeeeaaii

+1 en plus des en-têtes magiques, souvent utilisés pour l'évaluation en ligne de commande.
Wolf

28

Les guillemets simples sont des caractères ( char), les guillemets doubles sont des chaînes terminées par null ( char *).

char c = 'x';
char *s = "Hello World";

8
"bonjour le monde" est un const char *.
OldSchool

@Eiko quand mettez-vous un * devant une variable, par exemple * s comme ci-dessus?
CodeGuru

@CodeGuru Vous utilisez un * lorsque la variable est de type pointeur. Dans ce cas, 's' pointe vers un tableau de caractères.
Eiko

16
  • 'x' est un entier, représentant la valeur numérique de la lettre x dans le jeu de caractères de la machine
  • "x"est un tableau de caractères de deux caractères composé de ‘x’suivi de‘\0’

2
Assez tard;) qu'est-ce qui est vraiment nouveau dans votre réponse - comparé à ceux déjà donnés?
Wolf

10

Les guillemets simples sont pour un seul caractère. Les guillemets doubles correspondent à une chaîne (tableau de caractères). Vous pouvez utiliser des guillemets simples pour créer une chaîne un caractère à la fois, si vous le souhaitez.

char myChar     = 'A';
char myString[] = "Hello Mum";
char myOtherString[] = { 'H','e','l','l','o','\0' };

10

Je fouillais des trucs comme: int cc = 'cc'; Il se trouve que c'est essentiellement une copie d'octets vers un entier. Par conséquent, la façon de voir les choses est que «cc», qui est essentiellement 2 c, est copié pour réduire 2 octets de l'entier cc. Si vous cherchez un jeu-questionnaire, alors

printf("%d %d", 'c', 'cc'); would give:

99 25443

c'est parce que 25443 = 99 + 256 * 99

Donc «cc» est une constante à plusieurs caractères et non une chaîne.

À votre santé


8
  1. single quoteest pour character;
  2. double quoteest pour string.

6

Les guillemets doubles sont pour les littéraux de chaîne, par exemple:

char str[] = "Hello world";

Les guillemets simples sont pour les littéraux à caractère unique, par exemple:

char c = 'x';

EDIT Comme David l'a déclaré dans une autre réponse, le type d'un caractère littéral est int.


Merci . signifie que le caractère est de 1 octet sans caractère nul '/ 0' à la fin .. la chaîne contient un caractère nul à la fin.
Vishwanath Dalvi

2
@mr_eclair: Un littéral de chaîne contient toujours un terminateur nul implicite, mais soyez prudent. Vous pourriez écrire quelque chose comme char str[] = {'H','e','l','l','o'};, et vous strn'auriez pas de terminateur nul.
Oliver Charlesworth

dans cette situation, strn'est pas une chaîne (du moins, pas une chaîne de style C, qui est définie comme un NTBS).
Steve Jessop

@Steve: Compris. Mon point à @mr_eclair était que tout ce qui est un char[](que les gens considèrent souvent comme des "chaînes") n'est pas nul.
Oliver Charlesworth

1
@OliCharlesworth c'est - heureusement - pas toute la vérité: ce sont deux littéraux de chaîne séparés par un commentaire: "hello" /*seamlessly connected to*/ "world". Et cela peut avoir un sens pour les messages multilignes commentés.
Wolf

6

En C, les guillemets simples tels que «a» indiquent des constantes de caractères tandis que «a» est un tableau de caractères, toujours terminé par le caractère 0


4

Le guillemet simple est utilisé pour le caractère, tandis que le guillemet double est utilisé pour la chaîne.

Par exemple..

 printf("%c \n",'a');
 printf("%s","Hello World");

Production

un Hello World

Si vous les avez utilisés dans le cas inverse et que vous avez utilisé un guillemet simple pour la chaîne et un guillemet double pour le caractère. Ici, ce sera le résultat;

  printf("%c \n","a");
  printf("%s",'Hello World');

production :

pour la première ligne.Vous aurez une valeur de déchets ou inattendue.ou vous pouvez avoir une sortie comme celle-ci.

tandis que pour la deuxième déclaration. Vous ne verrez rien. Encore une chose. Si vous avez plus de déclaration après cela. Ils ne vous donneront également aucun résultat.

Remarque: le langage PHP vous donne la possibilité d'utiliser facilement les guillemets simples et doubles.


3

Les guillemets simples désignent un caractère, les doubles indiquent une chaîne.

En Java, c'est aussi la même chose.


2
Cela n'ajoute pas vraiment de valeur à la question, car ces informations ont déjà été incluses dans les autres réponses.
Mike Precup

2

Utilisez un guillemet simple avec un seul caractère comme:

char ch = 'a';

voici 'a'une constante char et est égale à la ASCIIvaleur de char a.

Utilisez des guillemets doubles avec des chaînes comme:

char str[] = "foo";

voici "foo"un littéral de chaîne.

C'est correct à utiliser, "a"mais ce n'est pas correct à utiliser 'foo'

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.