turbo sentencias sentencia saltos ruptura repetir que lazo etiquetas bucles c++ c++11 for-loop

sentencias - sentencia goto c++



¿Puede un bucle for tiene una asignación en su enunciado? (9)

Me encontré con esta sintaxis

for (string st; getline(is, st, '' ''); v.push_back(st)); ^ ^ ^ initialization condition, increment ???

¿Cómo funciona v.push_back(st) como un incremento cuando getline(is, st, '' '') cubre getline(is, st, '' '') ?


¿Cómo funciona v.push_back(st) como un incremento cuando getline(is, st, '' '') cubre getline(is, st, '' '') ?

No es así Has malentendido (o te has equivocado) con la construcción for loop.

Aquí están sus componentes:

  • una declaración para ser evaluada antes de que comience el ciclo;
  • una expresión que se evaluará al comienzo de cada iteración, que se cancelará si la expresión se convierte en booleano false ;
  • una declaración no declarativa que se evaluará al final de cada iteración.

Eso es.

No hay nada que dicte qué (si alguno) de estos componentes realiza un incremento. Considere el ejemplo común for (;;) ... ¡aquí no hay operaciones en absoluto, y mucho menos un incremento!


Del standard :

for ( init-statement condition(optional) ; iteration_expression(optional) ) statement

iteration_expression - cualquier expresión, que se ejecuta después de cada iteración del ciclo y antes de volver a evaluar la condición. Normalmente, esta es la expresión que incrementa el contador de bucles

La sintaxis anterior produce código equivalente a:

{ init_statement; while ( condition ) { statement; iteration_expression; } }

Entonces no tiene que ser un incremento.


Eso es equivalente a:

for (string st; getline(is, st, '' ''); ) v.push_back(st);

o:

{ string st; while (getline(is, st, '' '')) v.push_back(st); }

El hecho es que la instrucción de incremento se ejecuta al final del cuerpo del bucle cada vez que se cumple la condición. Entonces, puedes verlo como la última instrucción del cuerpo.

A veces, puede dejar el enunciado de incremento vacío; en este caso, pones la única instrucción del cuerpo en lugar de la declaración de incremento.


Este bucle se ejecutará mientras getline devuelve una secuencia sin errores (eche un vistazo al operator bool ). En cada iteración, el st se insertará en v . Yo volvería a escribir esto en términos de while loop:

string st; while(getline(is, st, '' '')) { v.push_back(st) }


La respuesta es que no funciona como un incremento.

El bucle for tendrá el mismo resultado que el ciclo while siguiente:

string st; while (getline(is, st, '' '')) { v.push_back(st); }

Uno podría argumentar si el ejemplo de bucle for que usted dio es un estilo de codificación deseable.


Lo único que importa es que el estado final del código en el bloque de condición tenga un valor. Ese valor se compara con cero, y si es cero, el bucle for no se ingresa. Básicamente, en los buenos y viejos días de programa de las empresas de telecomunicaciones que usaban C y Unix, el contenido del acumulador se evaluó en estado cero examinando el indicador ''Z''ero una vez que se ejecutó el código en el bloque de condición.


No incrementa nada. El bucle for finaliza cuando la parte de condición no se cumple. Entonces cuando getline devuelve falso, el ciclo terminará.

En muchos casos, la operación es de hecho incrementar una variable, y la condición probablemente verifica si esa variable no excede algún límite. No dejes que eso te confunda, solo recuerda que el ciclo for tiene la siguiente estructura (general):

for (init; condition; operation)


No tiene que ser una expresión de incremento. Lo que se espera que haga es determinado por usted. El código es exactamente el mismo que el siguiente semánticamente.

string st; // run before the loop and only once while (getline(is, st, '' '')) { // condition used to determine the loop should continue or break v.push_back(st); // run every time inside the loop }


v.push_back (st) es una función que realiza una operación en el parámetro ''st''. Sin embargo, no se muestra la operación según su pregunta. Entonces no podemos determinar si es un incremento. ¡Pero entonces, la sintaxis es muy posible!