50 votes

Les accolades autour du littéral de chaîne dans la déclaration de tableau de caractères sont-elles valides? (par exemple: char s [] = {"Hello World"})

Par accident, j'ai trouvé que la ligne char s[] = {"Hello World"}; est correctement compilé et semble avoir le même traitement que char s[] = "Hello World";. N'est pas le premier ({"Hello World"}) un tableau contenant un élément qui est un tableau de char, de sorte que la déclaration pour s en lecture char *s[]? En fait, si j'ai changer en char *s[] = {"Hello World"}; le compilateur accepte ainsi, comme prévu.

À la recherche d'une réponse, le seul endroit que j'ai trouvé qui c'est cette un mais il n'y a pas de citer le standard.

Donc ma question est, pourquoi la ligne char s[] = {"Hello World"}; est compilé bien que le côté gauche est de type array of char et le côté droit est de type array of array of char?

La suite est un programme de travail:

#include<stdio.h>
int main() {
    char s[] = {"Hello World"};
    printf("%s", s); // Same output if line above is char s[] = "Hello World";
    return 0;
}

Merci pour les précisions.

P. S. Mon compilateur est gcc-4.3.4.

64voto

Christoph Points 64389

Il est permis parce que la norme dit: C99 section 6.7.8, §14:

Un tableau de caractères peut être initialisé par un littéral de chaîne de caractères, éventuellement entre accolades. Des caractères successifs de la chaîne de caractères littérale (y compris les caractère de fin null si il ya de la place ou si le tableau est de taille inconnue) initialiser l' les éléments de la matrice.

Ce que cela signifie, c'est que les deux

char s[] = { "Hello World" };

et

char s[] = "Hello World";

sont rien de plus que du sucre syntaxique pour

char s[] = { 'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', 0 };

Sur une note connexe (même section, §11), C permet également des accolades autour de scalaire initialiseurs comme

int foo = { 42 };

qui, d'ailleurs, s'intègre parfaitement avec la syntaxe de littéraux composés

(int){ 42 }

22voto

Nawaz Points 148870

Les accolades sont facultatives, et l'expression est équivalente à un tableau de char.

Vous pouvez également écrire ceci:

 int a = {100}; //ok

Démo : http://ideone.com/z0psd

En fait, C++11 généralise cette syntaxe pour initialiser non-tableaux ainsi que des tableaux, de manière uniforme. Donc, en C++11, vous pouvez avoir ces:

int a{}; //a is initialized to zero, and it is NOT an array

int b[]{1,2,3,4}; //b is an array of size 4 containing elements 1,2,3,4

int c[10]{}; //all 10 elements are initialized to zero

int *d{}; //pointer initialized to nullptr

std::vector<int> v{1,2,3,4,5}; //vector is initialized uniformly as well.

3voto

Dennis Points 6145

Toute variable (int, char, etc.) est juste un tableau de longueur 1.

char s = {0};

fonctionne aussi bien.

2voto

MByD Points 78505

J'ai peut-être tort, mais je pense que ce n'est pas un tableau de tableaux de caractères, mais un bloc contient un tableau de caractères. int a = {1}; peuvent fonctionner aussi bien.

1voto

Jack Points 3695

[...] En fait, si j'ai changer de char *s[] = {"Bonjour le Monde"}; le compilateur accepte, comme attendu

Le compilateur accepets,parce que vous êtes en train de faire un tableau 2D de taille non définie éléments,où vous avez stocké un élément,le "Hello World" chaîne de caractères. Quelque chose comme ceci:

char* s[] = {"Hello world", "foo", "baa" ...};

Vous ne pouvez pas omettre l' bracets dans ce cas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X