2010-10-03 5 views
5

Malgré le mauvais style, est-il légal d'avoir une boucle for avec des accolades à l'intérieur des parens? Comme ceci:Est-ce pour ({instructions;}; condition; {instructions;}) légal C?

char *a = "a "; 
char *b = "b "; 

for ({ int aComesFirst = 1; 
     char *first = a; 
     char *second = b; 
     }; 
     aComesFirst >= 0; 
     { aComesFirst--; 
     swap(first, second); 
     }) 
{ 
    printf("%s%s\n", first, second); 
} 

Si quelque chose le long de ces lignes est possible, suis-je censé mettre un point-virgule après les premières accolades proches, ou serait-ce ajouter une instruction vide?

Je me rends compte qu'il est stylistiquement préférable de déplacer les déclarations char* en dehors de la boucle for et la swap à la fin de l'intérieur de la boucle. Mais le style n'est pas le point de cette question, je veux juste savoir si mettre des accolades à l'intérieur des parens est possible.

+0

Je suppose que cette horrible chose compile? – naiad

+0

Non, ce n'est pas le cas. C'est juste un exemple de la forme de réponse que je cherche. – AlcubierreDrive

+0

Connexes: http://stackoverflow.com/questions/3348766/how-to-initialize-several-variables-in-a-for-loop-in-c –

Répondre

9

j'ai répondu auparavant ... cela peut facilement être légalisé en C ou C++ en ajoutant un type struct local. C'est généralement un style médiocre.

char *a = "a "; 
char *b = "b "; 

for (struct loopy { 
     int aComesFirst; 
     char *first; 
     char *second; 
     } l = { 1, a, b }; /* define, initialize structure object */ 

     l.aComesFirst >= 0; /* loop condition */ 

     l.aComesFirst--, /* loop advance */ 
     swap(l.first, l.second) 
    ) 
{ 
    printf("%s%s\n", l.first, l.second); 
} 
+1

'struct loopy' Ah! +1 aime le tag -1 Arrrggghhhh; résultat +0 – pmg

+0

++ pour avoir piraté la boucle en travaillant réellement; la seule réponse directe à ma question. Et oui, c'est aussi élégant que le fond de la cloche. – AlcubierreDrive

+0

Il y a probablement des compilateurs qui vous permettront d'omettre 'loopy' et' l' pour déclarer un objet anonyme de type anonyme, donc vous pouvez prétendre qu'il n'existe pas. – Potatoswatter

6

Non, ce n'est pas légal, mais vous pouvez utiliser des virgules pour obtenir la moitié du chemin:

for (int a = 1, b = 2; a < 10; ++a, ++b) 

Vous ne pouvez pas déclarer plusieurs variables de types différents, et vous ne pouvez pas utiliser des structures de contrôle dans le dernier peu, mais c'est assez bon la plupart du temps. Si vous ne le saviez pas, la virgule utilisée ici n'est pas une syntaxe spéciale qui peut seulement être utilisée dans les boucles for, c'est un operator général qui peut être utilisé n'importe où pour évaluer l'opérande gauche, suivi de l'opérande de droite, et renvoie le résultat de l'expression correcte, à savoir a, b == b et a, b, c == c et ainsi de suite.

+0

Merci! J'accepterai votre réponse dans quelques minutes si c'est toujours le meilleur. – AlcubierreDrive

+0

... et, franchement, la structure 'while' équivalente sera plus claire de toute façon.Si vous êtes déterminé à obtenir une portée limitée, utilisez simplement un bloc libre {{} 'autour de la boucle d'initialisation-code-n-while. – dmckee

3

Non, ce n'est pas légal. Si c'était légal, le code ne fonctionnerait pas parce que c a une portée au niveau du bloc, donc vous n'aurez pas accès à l'une des variables définies dans les accolades.

+2

Bon point sur la portée au niveau du bloc. – AlcubierreDrive

2

Ce n'est pas juridique, mais cela est:

for(i = 0, j = 10; i < 10; i++, j--) 
{ 
    // .. 
} 

Voir: the comma operator

+0

++ pour le lien vers "l'opérateur virgule". Je ne savais pas que la virgule était un opérateur de première classe et si utile. – AlcubierreDrive

0

La norme dit (6.8.5.3/1)

pour (article 1, expr-2, expr-3) déclaration

Je suis assez sûr ni expr-2 ou expr-3 peut être remplacé par quelque chose de pas une expression (un bloc n'est pas une expression), et je suis assez sûr que clause-1 ne peut pas non plus être remplacé par une déclaration.

+0

+1 pour la citation pertinente et pour contrer celui qui était l'idiot downvoting. –

1

Utilisez-vous le gcc avec des expressions d'instructions? http://tigcc.ticalc.org/doc/gnuexts.html#SEC63 Peut-être que cela fera fonctionner ce type de code. sauf que c'est (int i = { stmts; }; { stmts; bool}; { ... })

+0

++ Merci de m'avoir montré l'extension Statement Expressions. – AlcubierreDrive