2010-12-01 30 views
5

Pregunta simple. Imagine esto en ANSI-C:¿Se mantiene el contador For-Loop?

int i; 

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

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

¿Esta salida "i es 5"?

Está i conservados o es el valor de i indefinido después del bucle?

Respuesta

14

Sí. Si i se declara fuera del bucle for, permanece en el alcance después de que el bucle finalice. Conserva el valor que tenía en el punto donde salía el bucle.

Si declatred I en el bucle:

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

} 

Entonces i es indefinido tras la salida de bucle.

1

La variable i se define fuera del alcance del bucle (lo que es genial, o no sería capaz de imprimirlo en ese caso).

Y está post-icnremented para cada vuelta del ciclo, para el cual la condición final es "detener cuando sea mayor o igual a 5".

Por lo tanto, realmente tiene sentido para mí ser igual a 5 en este momento.

Un ámbito de bloque no es exactamente lo mismo que un ámbito de función en C. La variable i no "vuelve" mágicamente a su valor anterior cuando salga del alcance del bucle.

1

i El valor será 5 después del ciclo. A menos que haya hecho algo como

i = 50000; 

dentro de ella.

0

También se recomienda generalmente no utilizar "i" después de salir del ciclo en la mayoría de los estándares de codificación que he leído. En particular, NO lo haga:

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; 
} 

Si bien esto funcionará, es una codificación deficiente. Es menos legible y mantenible que las alternativas. P.ej.

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

Sí, las variables son válidas solo dentro del bloque en el que se declaran. He aquí un ejemplo:

#include <stdio.h> 

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

    x = 1; 
} 

Ese es el compilador:

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, ¿qué? Él preguntó "¿Es A el caso o es B?". Tal pregunta no puede contestarse satisfactoriamente simplemente "Sí" o "No". También declaró su variable fuera del bloque. No considero que esta respuesta sea relevante o necesaria (ya que no agrega información nueva que no esté ya contenida en respuestas anteriores). – AlastairG

+0

Sí, tienes razón. Simplemente respondo 'sí' porque alguien ya me explicó por qué me preservaron (la respuesta de Visage fue la mejor). Pensé que agregar este ejemplo podría ser útil para completar otras respuestas. =) – BlackBear

Cuestiones relacionadas