2012-05-30 19 views
8

Varios libros me muestran cómo escribir correctamente para, while y do bucles. Muchos artículos en línea los comparan entre sí.C bucles-OK para cambiar el contador o la condición dentro del bucle?

Pero no he encontrado ningún lugar que me diga lo que no debo hacer. Por ejemplo, ¿arruinaría las cosas si cambio el valor del contador o la variable de condición dentro del ciclo?

Me gustaría recibir una respuesta que no dependa de la máquina.

Respuesta

7

Sí, puede cambiar el contador dentro de un bucle y a veces puede ser muy útil. Por ejemplo, al analizar los argumentos de la línea de comandos donde hay un indicador de opción seguido de un valor. Un ejemplo de esto se muestra a continuación:

introduzca el siguiente comando:

program -f filename -o option -p another_option

Código:

#include <string.h> 

int main(int argc, char** argv) 
{ 

char *filename, *option, *another_option; 

if(argc > 1){ 
    for(int i=1; i<argc; i++){ 
    if(strcmp(argv[i],"-f")==0){ 
     filename = argv[++i]; 
    } else if(strcmp(argv[i],"-o")==0){ 
     option = argv[++i]; 
    } else if(strcmp(argv[i],"-p")==0){ 
     another_option = argv[++i]; 
    } else { 
     printf("Option \"%s\" not recognized, skipping\n",argv[i]); 
     continue; 
    } 
    } 
} /* end if argc > 1 */ 

return 0; 
} 

El programa de ejemplo, se incrementa automáticamente el contador para acceder a la cadena de línea de comando correcto. Por supuesto, hay maneras de incorporar contadores, etc., pero solo harían que el código fuera más engorroso en este caso.

Como otros han señalado, aquí es donde muchas personas escriben errores y uno debe tener cuidado al incrementar los contadores dentro de los bucles, particularmente cuando el bucle está condicionado al valor del contador.

+0

¡Gran ejemplo! ¡Voto ascendente! – Jay

3

Sí, puede cambiar las variables de contador y condición. Simplemente serán evaluados con la próxima iteración del ciclo.

7

No es válido para cambiar un contador de bucle dentro de un bucle en C.

Sin embargo, es probable que sea confuso para los lectores del futuro y eso es una buena razón no hacerlo.

1

Sí, en C/C++/C# Puede cambiar el contador, etc. en el bucle.

4

Depende de lo que quiere decir con "arruinar las cosas".

Si sabe lo que está haciendo, puede cambiar el contador. El lenguaje no tiene restricciones en esto.

4

Se permite cambiar la variable del contador en el ciclo, pero tenga cuidado de saber lo que está haciendo para no crear bucles infinitos disminuyendo la variable cuando no debería.

Algunos algoritmos en realidad se benefician de esto, pero por supuesto si haces esto hace que tu código sea menos legible, así que asegúrate de comentar lo que estás haciendo también.

1

Al igual que muchas otras técnicas, siempre que sepa lo que hace, está bien.

Por ejemplo, este código:

int i; 
for (i=0;i<5;i++) 
    printf("%d\n",i--); 

es un bucle infinito, pero esta versión del ordenamiento de burbuja:

int *arr,n; 
//allocate memory, assign values, and store the length of the array in n 
int i; 
for (i=0;i<n-1;i++) 
    if (arr[i]>arr[i+1]) { 
    int temp=arr[i]; 
    arr[i]=arr[i+1]; 
    arr[i+1]=temp; 
    if (i) i-=2; 
    } 

está muy bien. (No es exactamente tipo burbuja)En lugar de utilizar bucles anidados, vuelvo a la matriz después de intercambiar miembros en ella)

2

Definitivamente puede. Pero tenga cuidado de no cometer el trastorno del bucle. Alter un conter en el loop sucede mucho en do ... while y while.

do{ 
    counter++; 
    some expressions; 
} 
while(counter < SOMEVALUE); 
0

Podemos cambiar el valor del contador dentro del bucle, pero el valor del contador definitiva no será reflejado como el bucle suele anular el valor del contador. aquí está el ejemplo en el script QTP VB.

iLast = 4 
For i= 1 to iLast 
iLast=2  
Next 

Aquí el bucle debe ejecutar sólo por 2 veces el valor iLast se actualiza a 2 en el interior del bucle, pero se está ejecutando por 4 veces.

1

Tenga cuidado al cambiar la variable del contador dentro de un bucle, no todos los bucles son iguales, mientras que el bucle "while" se comporta de manera diferente. ver este ejemplo?

No, es NOT un bucle infinito (en algunos compiladores). ejecutarlo, y ver ...

i=5; 
while (i--) 
{ 
    i=100; 
    printf("%d \n",i) 
} 
Cuestiones relacionadas