2010-12-01 7 views
5

Simple question. Imaginez ceci dans ANSI-C:Le compteur For-Loop reste-t-il?

int i; 

for(i=0 ; i<5 ; i++){ 
    //Something... 
} 

printf("i is %d\n", i); 

Est-ce que cette sortie "i est 5"?

Est-ce que i est conservé ou la valeur de i est-elle indéfinie après la boucle?

Répondre

14

Oui. Si i est déclaré en dehors de la boucle for, il reste dans la portée après la fermeture de la boucle. Il conserve toute valeur qu'il avait au point où la boucle est sortie.

Si vous je declatred dans la boucle:

for (int i = 0 ; i < 5 ; i++) 
{ 

} 

Alors je n'est pas défini après la sortie de la boucle.

1

La variable i est définie en dehors de la portée de la boucle (ce qui est génial, ou vous ne seriez pas en mesure de l'imprimer dans ce cas).

Et il est post-icnremented pour chaque tour de la boucle, pour lequel la condition de fin est "stop quand i est plus grand ou égal à 5".

Donc il est vraiment logique que je sois égal à 5 ​​à ce stade.

Une portée de bloc n'est pas exactement la même que celle d'une fonction en C. La variable i ne revient pas magiquement à sa valeur précédente lorsque vous sortez de la portée de la boucle.

1

La valeur de i sera 5 après votre boucle. Sauf si vous avez fait quelque chose comme

i = 50000; 

à l'intérieur.

0

Il est également généralement recommandé d'utiliser "i" après avoir quitté la boucle dans la plupart des normes de codage que j'ai lues. En particulier ne PAS faire:

for(i = 0; i < num_elements; i++) 
{ 
    if(element[i].id == id) 
    { 
     /* Do something to element here. */ 
     break; 
    } 
} 

if(i == num_elements) 
{ 
    fprintf(stderr, "Failed to find element %d.", id); 
    succeeded == false; 
} 

Bien que cela fonctionne, c'est un mauvais codage. Il est moins lisible et maintenable que les alternatives. Par exemple.

succeeded = false; 

for(i = 0; i < num_elements; i++) 
{ 
    if(element[i].id == id) 
    { 
     /* Do something to element here. */ 
     succeeded = true; 
     break; 
    } 
} 

if(false == succeeded) 
{ 
    fprintf(stderr, "Failed to find element %d.", id); 
} 
0

Oui, les variables ne sont valides que dans le bloc dans lequel elles sont déclarées. Voici un exemple:

#include <stdio.h> 

void main(int argc, char *argv[]) 
{ 
    if(argc == 2) { 
     int x; 
     x = 7; 
    } 

    x = 1; 
} 

C'est le compilateur:

gcc ex.c 
ex.c: In function ‘main’: 
ex.c:10: error: ‘x’ undeclared (first use in this function) 
ex.c:10: error: (Each undeclared identifier is reported only once 
ex.c:10: error: for each function it appears in.) 
+0

Err, quoi? Il a demandé "Est-ce que c'est le cas ou est-ce B?". Une telle question ne peut pas être satisfaite simplement par "Oui" ou "Non". Il a également déclaré sa variable en dehors du bloc. Je ne trouve pas cette réponse pertinente ou nécessaire (car elle n'ajoute aucune nouvelle information non déjà contenue dans les réponses précédentes). – AlastairG

+0

Oui, vous avez raison. Je réponds simplement 'oui' parce que quelqu'un a déjà expliqué pourquoi je suis préservé (la réponse de Visage était la meilleure). Je pensais que l'ajout de cet exemple pourrait être utile pour compléter d'autres réponses. =) – BlackBear