J'ai été très surpris quand j'ai vu cette notation. Que fait-il et quel genre de notion C est-ce? P>
5 Réponses :
{0, 2} code> est la notation pour un tableau constitué de 0 et 2. Li>
-
(int [2]) code> le jette à un tableau (ne sait pas pourquoi) s>. Li>
-
int * a = code> l'attribue au pointeur AT a. li>
ul> Sans la distribution, le compilateur le voit comme une tentative d'attribution de plusieurs valeurs à une variable scalaire.
(int [2]) indique au compilateur que l'expression suivante doit être coulée sur INT [2]. Ceci est requis depuis {0, 2} peut être coulé sur différents types, comme Long [2]. La fonte se produit au moment de la compilation - pas d'exécution. p>
L'ensemble de l'expression crée une matrice en mémoire et définit A pour pointer sur ce tableau. P>
int code> s. li>
- popule [la matrice de] les deux
int code> S avec les valeurs 0 code> et 2 code>, respectivement. li>
- déclare une variable locale de type
int * code> et attribue à cette variable l'adresse de [la matrice de] les deux int code> s. li> s.
ol> Il s'agit d'un littéral composé tel que défini à la section 6.5.2.5 de la norme C99.
Ce n'est pas une partie de la langue C ++, il n'est donc pas surprenant que les compilateurs C ++ ne le compilent pas. (ou compilateurs Java ou ADA pour cette matière) P>
la valeur du littéral composé est celle d'un objet non nommé initialisé par le
Liste d'initialistes. Si le littéral composé se produit à l'extérieur du corps d'une fonction, l'objet
a une durée de stockage statique; Sinon, il a une durée de stockage automatique associée à
Le bloc enfermé. em> p> donc non, il ne détruira pas la pile. Le compilateur alloue stockage pour l'objet. P> par la parenthèse est placé autour du type et est ensuite suivi d'une liste d'initialistes - ce n'est pas une distribution, car une liste initiale à initialiser n'a aucune signification dans la syntaxe C99; Au lieu de cela, il s'agit d'un opérateur postfix appliqué à un type qui donne un objet du type donné. Vous ne créez pas pourquoi il est utilisé, je ne peux pas voir une bonne raison pour elle dans votre seule ligne, bien que cela puisse être que A pourrait être réaffecté de pointer à un autre tableau, et c'est donc une manière plus courte de Faire les deux premières lignes de: p> J'ai trouvé utile pour passer des syndicats temporaires à des fonctions p> {0, 3} code> et le casser sur une matrice, vous initiez à un int [2] code> avec les valeurs 0 et 3. P>
Grande explication! Bon exemple avec l'Union, il est assez difficile d'initialiser et de passer un pointeur à une fonction. Il semble ressembler à des tableaux anonymes. Dommage qu'il ne soit pas implémenté en C ++
Je viens de chercher des préparations anonymes en C ++ et il semble que quelque chose d'un peu similaire va être mis en œuvre dans c ++ 0x: std :: initializer_list <>, où, pour notre exemple, vous pouvez spécifier STD :: initialiszizer_list
Il s'agit d'une construction C99, appelée em> littéral em>.
du projet de comité de mai 2005 Section 6.5.2.5: P>
une expression postfix qui consiste en un nom de type parenthèse suivi de une liste d'initialiseurs fermées est un littéral composé. Il fournit un objet sans nom dont la valeur est donnée par la liste d'initialistes. P>
... p>
Exemple 1 La définition de la portée du fichier p> blockQuote>
xxx pré> initialise p pointer vers le premier élément d'un tableau de deux intens, le premier ayant la valeur deux et la seconde, quatre. Les expressions dans ce composé littéral sont nécessaires pour être constants. L'objet non nomé a stockage statique Durée. P> blockQuote> p>
Il ne compile pas avec VC ++ lors de la compilation en mode C. Quel compilateur avez-vous essayé?
Cela fonctionne sur GCC, alors peut-être que ce n'est pas dans la norme C?
Je vais deviner que vous avez raison - c'est une autre extension de GCC. Je ne sais pas ce que vous gagnez avec cela.
@Arak: Je pense que C mode C dans VC ++ est un peu pauvre.
VC ++, lors de la compilation du code C, ne prend en charge que C89 - NOT C99, qui est l'endroit où cette fonctionnalité est définie.