C99: Puis-je déclarer des variables au début d'un bloc dans un « pour »?

StackOverflow https://stackoverflow.com/questions/1880745

  •  18-09-2019
  •  | 
  •  

Question

est le code suivant légal selon C99?

...
for(....) {
int x = 4;
...
}
...

Vous pouvez supposer que, avant la ligne 3 la variable x n'a jamais été déclarée.

C99 (PDF)

Jusqu'à présent, je n'ai trouvé ce qui suit, mais je ne pense pas que cela suffit:

Un bloc permet une série de déclarations et d'être regroupées en une unité syntaxique. Les initialiseurs d'objets qui ont une durée de stockage automatique, et la longueur variable déclarateurs de tableau d'identificateurs ordinaires avec la portée du bloc, sont évaluées et les valeurs sont stockée dans les objets (y compris le stockage d'une valeur indéterminée dans des objets sans initialiseur) chaque fois que la déclaration est atteinte dans l'ordre d'exécution, comme si elle était un déclaration, et dans chaque déclaration dans l'ordre déclarateurs apparaissent.

De la page 145 de ce PDF.

Était-ce utile?

La solution

Oui, vous pouvez déclarer ou définir une variable où vous voulez en C99 (au début d'un bloc C89).

Vous avez dit:

  

"Vous pouvez supposer que, avant la ligne 3 du   variable x n'a jamais été déclarée. "

Même si elle a déjà été déclarée, vous pouvez déclarer une variable nouveau avec le même nom. En faisant cela vous empêche d'accéder à l'ancienne variable dans ce bloc.

int x = 0;               /* old x */
printf("%d\n", x);       /* old x, prints 0 */
do {
    int x = 42;          /* new x */
    printf("%d\n", x);   /* new x, prints 42 */
} while (0);
printf("%d\n", x);       /* old x, prints 0 */

Je ne l'ai jamais essayé ce qui suit dans C99. Je ne sais vraiment pas ce qui se passe :)
Je vais essayer plus tard, quand j'avoir accès à un (presque) compilateur C99

int x = 0;
do {
    printf("%d\n", x);   /* old x? new x? crash? Undefined Behaviour? */
    int x = 42;
} while (0);

La fonction C99 de déclarer / la définition des variables là où l'on veut est pas une fonctionnalité qui me donne envie de changer:)

Autres conseils

est légal dans les deux C99 et C89. Regardez 6.8.2, qui définit la déclaration composé

Oui, vous pouvez créer une variable au début de tout bloc. La variable est initialisée à chaque fois que le bloc est entré en C ++, vous pouvez les créer partout dans le bloc.

for(....)
{
  int x=4;
  /*More code*/
}

Oui cela est légal dans C99 mais vous n'êtes pas autorisé à accéder « x » après la block.It serait Undefined Comportement essayant d'accéder à « x » au-delà de son champ d'application.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top