2016-08-30 1 views
1

Peut-on définir une variable de structure après sa déclaration ou définition en une fois? Tous ensemble des accolades simples commeInitialisation/définition de variable de structure en une fois après que la déclaration de variable est terminée

asd = {21,'H'}; 

Une raison particulière si elle ne peut se faire, car il peut être défini dans la même ligne où il est déclaré .: struct asd = {21,'H'};? Par exemple

struct test 
{ 
    int a; 
    char b; 
}asd; 

asd = {21,'H'}; // error: expected an expression 

Demandé pour la programmation C.

+0

Parce que l'initialisation agrégée est différente de l'affectation. –

+0

fyi: 'auto asd = {21, 'H'};' ne fonctionne pas. 'auto asd = {21,22};' compile, mais ne fait pas ce que vous demandez. –

+6

Pourriez-vous choisir une langue, s'il vous plaît. c n'est pas C++ n'est pas c. –

Répondre

0

La distribution de type explicite est nécessaire:

struct test 
{ 
    int a; 
    char b; 
} asd; 

asd = (struct test){21,'H'}; 

Ce code est à peu près équivalent à la suivante:

const struct test initialiser = {21,'H'}; 
... 
asd = initialiser; 

La différence est que le compilateur a une option pour optimiser l'attribution d'un valeur à la variable asd en utilisant des instructions assembleur avec des valeurs immédiates lorsque cette optimisation est plus efficace que l'initialisation de la structure const.

En effet 'côté' cette syntaxe est valable dans les deux C et C++

+0

@ 2501 Je ne savais pas qu'il a un nom spécifique. Pourriez-vous me le dire, s'il vous plaît? – Serge

+0

@nathanoliver 1. Peut-on faire la même chose avec struct asd [5]; après sa déclaration? Pas comme * (asd + 3) = (struct tt) {-2, '\ 0'}; Mais pour tous les éléments de tableau comme ensemble dans une ligne. 2. Tous les tableaux normaux peuvent-ils être int ary [5] = {1,22,31,231,5}; peut être fait après sa déclaré? par exemple: ary = (int) {1,22,31,231,5}; – Lpdnn

+0

@Lpdnn Malheureusement, non, les tableaux ne peuvent pas être affectés de cette façon. La seule solution consiste à faire d'un tableau un membre d'une structure; – Serge

0
struct test 
{ 
    int a; 
    char b; 
}asd; 

est la définition de la structtest et la asd variable de type test. Au ; vous avez maintenant un objet construit par défaut appelé asd. Lorsque vous essayez de faire

asd = {21, 'H'}; 

Vous essayez d'assigner à asd et la liste CONTREVENTÉES qui ne fonctionnera pas, car il ne dispose pas d'un opérateur d'affectation qui prend une liste d'initialisation.

Vous pouvez initialiser asd lorsque vous déclarez comme

struct test 
{ 
    int a; 
    char b; 
}asd = {21, 'H'}; 

ou faire l'affectation comme

asd = (struct test){21, 'H'}; 

Si vous avez choisi d'utiliser l'affectation ne note que cela doit être fait dans une fonction et pas dans l'espace global.

+0

L'affectation doit être en main, sinon, vous obtenez cette erreur: 'error: 'asd' ne nomme pas un type' –

+0

@ArnavBorborah Ajouté à ce sujet. – NathanOliver

+0

@Lpdnn J'utilisais la syntaxe C++. J'ai mis à jour la réponse avec la syntaxe C. – NathanOliver

0

Comme mentionné @CaptainOblivious:

–aggregate initialization is different from assignment.

Ce que cela signifie, est que vous ne pouvez pas utiliser l'initialisation globale dans l'affectation des objets globaux plus tard, sans être explicite ou séparée, comme ceci:

struct test 
{ 
    int a; 
    char b; 
}asd; 
int main() {asd.a = 21; asd.b = 'H'} 

Une autre chose à faire serait d'être explicite plus tard (cela doit être fait dans main, ou dans un autre bloc de code, ou vous obtenez une erreur (asd does not name a type)):

asd = test{21,'H'} 

Une autre chose que vous pouvez faire est la suivante:

struct test 
{ 
    int a; 
    char b; 
}asd = {21,'H'}; 

Les deux serait au-dessus de travailler aussi bien, comme on le voit ici: Live Example

-1

Si vous définissez une variable de ce type que vous doit inclure la pièce struct, comme struct asd. Mais cette définition et cette initialisation fonctionnent toutes très bien.

struct test 
{ 
    int a; 
    char b; 
} asd = { 21, 'H'}; 
+0

OP a demandé si la définition et l'intialisation peuvent être faites en une seule fois, et ma réponse montre que c'est possible. Merci pour la belle downvote. Si vous savez mieux, partagez vos connaissances, afin que nous puissions tous en bénéficier. –