2009-12-10 4 views
1

Le code suivant est-il légal selon C99?C99: Puis-je déclarer des variables au début d'un bloc dans un 'for'?

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

Vous pouvez supposer qu'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 un ensemble de déclarations et être regroupées en une seule unité syntaxique. Les initialiseurs d'objets ayant une durée de stockage automatique et les variables de longueur variable sont évalués et les valeurs sont stockées dans les objets (y compris le stockage d'une valeur indéterminée dans des objets sans initialisateur ) heure à laquelle la déclaration est atteinte dans l'ordre d'exécution, comme s'il s'agissait d'une instruction , et dans chaque déclaration dans l'ordre dans lequel les déclarants apparaissent.

À partir de la page 145 de ce PDF.

Répondre

7

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

Vous avez dit:

"Vous pouvez supposer que, avant la ligne 3 la 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 nouvelle variable avec le même nom. 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 n'est pas une caractéristique qui me donne envie de changer :)

+1

Ancien x. La portée d'une variable automatique commence là où elle est définie et court jusqu'à la fin du bloc. –

+1

Pour être honnête, l'ombrage des variables automatiques est un peu douteux de toute façon. Les déclarer au début du bloc n'empêche pas quelqu'un d'essayer d'utiliser le x externe, et d'obtenir l'interne plutôt parce qu'ils ont oublié qu'il était là. Si vous pouvez faire confiance à quelqu'un pour faire face à des variables cachées, je pense que vous devez leur faire confiance pour connaître les règles de portée - si vous utilisiez un compilateur C99 tout le temps, vous les connaîtriez assez rapidement, car vous le sauriez que si le x externe n'existait pas du tout, cette boucle C99 ne compilerait pas. –

13

Ceci est légal dans C99 et C89. Regardez en 6.8.2, qui définit l'instruction composée

+1

Pouvez-vous ajouter un peu plus de détails? Lequel des 3 cas suis-je? Merci! – quilby

+0

@quilby: Dans C89, vous pouvez déclarer des variables au début d'une nouvelle portée, qui est un bloc {}. Dans C99, vous pouvez déclarer des variables où vous le souhaitez dans une étendue. –

+0

Toute idée si cela a été introduit en C89, ou était présent dans les éditions précédentes C? http://programmers.stackexchange.com/questions/300223/when-was-block-scope-for-variables-introduced-to-c-and-why-is-it-still-frowned – cnst

1

Oui, vous pouvez créer une variable au début d'un bloc. La variable est initialisée chaque fois que le bloc est entré En C++, vous pouvez les créer n'importe où dans le bloc.

+1

En C99 vous pouvez les créer partout aussi bien. – nos

+0

Montre combien codage C99 je fais :-) –

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

Ouais ce qui est légal en 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.

+1

Ce ne serait pas un comportement indéfini. Ce serait une erreur de compilation de se référer à «x» au-delà de sa portée. –

Questions connexes