10
votes

Qu'est-ce que "int * a = (int [2]) {0, 2};" exactement faire?

J'ai été très surpris quand j'ai vu cette notation. Que fait-il et quel genre de notion C est-ce?

c

5 commentaires

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.


5 Réponses :


-2
votes
  • {0, 2} est la notation pour un tableau constitué de 0 et 2.
  • (int [2]) le jette à un tableau (ne sait pas pourquoi) .
  • int * a = l'attribue au pointeur AT a.

1 commentaires

Sans la distribution, le compilateur le voit comme une tentative d'attribution de plusieurs valeurs à une variable scalaire.



0
votes

(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.

L'ensemble de l'expression crée une matrice en mémoire et définit A pour pointer sur ce tableau.


0 commentaires

1
votes
  1. alloue, sur la pile, espace pour [un tableau de] deux int s.
  2. popule [la matrice de] les deux int S avec les valeurs 0 et 2 , respectivement.
  3. déclare une variable locale de type int * et attribue à cette variable l'adresse de [la matrice de] les deux int s. s.

0 commentaires

19
votes

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)

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

donc non, il ne détruira pas la pile. Le compilateur alloue stockage pour l'objet.

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 {0, 3} et le casser sur une matrice, vous initiez à un int [2] avec les valeurs 0 et 3.


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: xxx

J'ai trouvé utile pour passer des syndicats temporaires à des fonctions xxx


2 commentaires

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 En tant qu'argument dans le prototype de fonction et donnez une liste d'initialistes telle que {0, 2} à la fonction.



6
votes

Il s'agit d'une construction C99, appelée littéral .

du projet de comité de mai 2005 Section 6.5.2.5:

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.

...

Exemple 1 La définition de la portée du fichier xxx

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.


0 commentaires