C++ En bucle


Ejemplo

Un bucle for ejecuta instrucciones en el loop body del loop body , mientras que la condition del bucle es verdadera. Antes de que la initialization statement bucle se ejecute exactamente una vez. Después de cada ciclo, se ejecuta la parte de iteration execution .

Un bucle for se define de la siguiente manera:

for (/*initialization statement*/; /*condition*/; /*iteration execution*/)
{
    // body of the loop
}

Explicación de las declaraciones del marcador de posición:

  • initialization statement : esta sentencia se ejecuta solo una vez, al comienzo del bucle for . Puede ingresar una declaración de múltiples variables de un tipo, como int i = 0, a = 2, b = 3 . Estas variables solo son válidas en el ámbito del bucle. Las variables definidas antes del bucle con el mismo nombre se ocultan durante la ejecución del bucle.
  • condition : esta declaración se evalúa antes de cada ejecución del cuerpo del bucle y cancela el bucle si se evalúa como false .
  • iteration execution : esta instrucción se ejecuta después del cuerpo del bucle, antes de la siguiente evaluación de la condición , a menos que el bucle for sea ​​abortado en el cuerpo (por break , goto , return o una excepción lanzada). Puede ingresar varias declaraciones en la parte de iteration execution , como a++, b+=10, c=b+a .

El equivalente aproximado de un for de bucle, reescrito como un while bucle es:

/*initialization*/
while (/*condition*/)
{
    // body of the loop; using 'continue' will skip to increment part below
    /*iteration execution*/
}

El caso más común para usar un bucle for es ejecutar sentencias un número específico de veces. Por ejemplo, considere lo siguiente:

for(int i = 0; i < 10; i++) {
    std::cout << i << std::endl;
}

Un bucle válido también es:

for(int a = 0, b = 10, c = 20; (a+b+c < 100); c--, b++, a+=c) {
    std::cout << a << " " << b << " " << c << std::endl; 
}

Un ejemplo de ocultar variables declaradas antes de un bucle es:

int i = 99; //i = 99
for(int i = 0; i < 10; i++) { //we declare a new variable i
    //some operations, the value of i ranges from 0 to 9 during loop execution
}
//after the loop is executed, we can access i with value of 99

Pero si desea utilizar la variable ya declarada y no ocultarla, omita la parte de declaración:

int i = 99; //i = 99
for(i = 0; i < 10; i++) { //we are using already declared variable i
    //some operations, the value of i ranges from 0 to 9 during loop execution
}
//after the loop is executed, we can access i with value of 10

Notas:

  • Las instrucciones de inicialización e incremento pueden realizar operaciones no relacionadas con la declaración de condición, o nada en absoluto, si así lo desea. Pero por razones de legibilidad, es una buena práctica realizar solo operaciones directamente relevantes para el bucle.
  • Una variable declarada en la declaración de inicialización es visible solo dentro del alcance del bucle for y se libera al finalizar el bucle.
  • No olvide que la variable que se declaró en la initialization statement se puede modificar durante el bucle, así como la variable verificada en la condition .

Ejemplo de un bucle que cuenta de 0 a 10:

for (int counter = 0; counter <= 10; ++counter)
{
    std::cout << counter << '\n';
}
// counter is not accessible here (had value 11 at the end)

Explicación de los fragmentos de código:

  • int counter = 0 inicializa la variable counter a 0. (Esta variable solo se puede usar dentro del bucle for ).
  • counter <= 10 es una condición booleana que verifica si el counter es menor o igual a 10. Si es true , el bucle se ejecuta. Si es false , el bucle termina.
  • ++counter es una operación de incremento que incrementa el valor de counter en 1 antes de la siguiente verificación de condición.

Al dejar todas las declaraciones en blanco, puede crear un bucle infinito:

// infinite loop
for (;;)
    std::cout << "Never ending!\n";

El while de bucle equivalente de la anterior es:

// infinite loop
while (true)
    std::cout << "Never ending!\n";

Sin embargo, aún se puede dejar un bucle infinito utilizando las instrucciones break , goto o return o lanzando una excepción.

El siguiente ejemplo común de iteración sobre todos los elementos de una colección STL (por ejemplo, un vector ) sin usar el encabezado <algorithm> es:

std::vector<std::string> names = {"Albert Einstein", "Stephen Hawking", "Michael Ellis"};
for(std::vector<std::string>::iterator it = names.begin(); it != names.end(); ++it) {
    std::cout << *it << std::endl;
}