Como usar for em C++: estrutura explicada em 3 pontos, sem mistério!

Imagem com fundo azul e preto e texto Como usar for em C++

Quase todas as linguagens de programação possuem alguma estrutura de controle para executar um bloco de código repetidas vezes, em um loop. Muitas delas, ainda mais, utilizam o mesmo nome para as instruções que declaram estes laços de repetição, e o mais conhecido dentre eles é certamente o for: O for em C++ é um elemento central na implementação de quase todos os programas que existem hoje em dia – basta que se imagine alguma instrução ou operação realizada repetidas vezes em uma programa e voilà, aí está o for.


Sintaxe do for em C++

A sintaxe do for é muito simples: for (declaração de inicialização; condição de controle; expressão de iteração) {bloco de código com instruções} . Logo, para percorrer e imprimir na tela os números inteiros de 1 a 10, por exemplo, basta escrever o seguinte:

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

for (<declaração de inicialização>; <condição de controle>; <expressão de iteração>) {<bloco de código do corpo do for>}


A estrutura do for em C++

A sintaxe do for em C++, mostrada no bloco anterior, contém três elementos principais, dos quais falarei na ordem seguinte: declaração de incialização, condição de controle e expressão de iteração. Além disso, há ainda o bloco de código no corpo do for, que contém as instruções a serem executadas em cada repetição.


Declaração de inicialização

O primeiro parâmetro dos laços for em C++ é a declaração de inicialização, que permite inicializar uma variável ou executar uma função antes que a primeira repetição do laço seja executada; ou seja, essa declaração é processada na etape de “preparação” do for.

O uso mais comum dessa declaração de inicialização é a definição de uma variável – normalmente nomeada i – que armazena o valor inicial de uma faixa de valores (exemplo 1, primeiro for), ou o índice que será usado para percorrer um array (exemplo 1, segundo for). A declaração de inicialização também pode ser usada para outras finalidades que definir variáveis, como invocar funções ou atribuir valores a variáveis já existentes (exemplo 1, terceiro for).


Exemplo 1 – Como usar for em C++

#include <iostream>
#include <vector>

using namespace std;
    
int getZero() {
    return 0;
}

int main()
{
    cout << "Primeiro for - Valor de i: ";
    for (auto i = 0; i < 10; ++i) {
        cout << i << " ";
    }
    
    std::vector<int> vetorDeInteiros{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    cout << "\nSegundo for - Valor de i: ";
    for (auto i = 0; i < vetorDeInteiros.size(); ++i) {
        cout << vetorDeInteiros[i] << " ";
    }
    

    int i = 99;
    bool continueRodando = true;
    cout << "\nTerceiro for - Valor de i: ";
    for (i = getZero(); continueRodando; ++i) {
        cout << i << " ";
        if (i == 9) {
            continueRodando = false;
        }
    }
}

Primeiro for – Valor de i: 0 1 2 3 4 5 6 7 8 9
Segundo for – Valor de i: 0 1 2 3 4 5 6 7 8 9
Terceiro for – Valor de i: 0 1 2 3 4 5 6 7 8 9


Condição de controle

Voltemos ao exemplo 1 para entender como funciona a condição de controle dos laços for em C++. Vemos no primeiro for (linha 16) que a condição é i < 10, uma condição bastante simples: “enquanto i for menor que 10″. Mas enquanto i for menor que 10 o que acontece? Pela saída do programa é possível deduzir o seguinte: a condição de controle determina, enquanto for verdadeira, que o laço de repetição continuará sendo executado; se for falsa, o for encerrará sua execução e o programa passará para a linha seguinte à chave ( } ) que termina o laço.

A condição de controle é verificada no início de cada iteração, e não no fim. Assim sendo, é possível que o for nem mesmo seja executado se desde o inicio o valor da condição de controle for false.

Contudo, a condição de controle não precisa ser uma comparação do tipo “menor que”, “igual”, “maior ou igual a” etc, ela pode ser qualquer expressão que possa ver convertido em um valor verdadeiro (true) ou falso (false). Nós podemos ver no exemplo 1, no terceiro for, esse outro tipo de expressão sendo executada.

No segundo for, a condição de controle é i < vetorDeInteiros.size(), que à primeira vista pode parecer diferente daquela do primeiro for em natureza, mas quando olhamos com cuidado notamos que a expressão vetorDeInteiros.size() retorna a quantidade de elementos no vetor – 10, no nosso exemplo -, e portanto a condição de controle torna-se i < 10: a mesma do primeiro for (com exceção de que o tipo de retorno do método size() do container vector é size_t, e não int).


Expressão de iteração

No terceiro elemento do for em C++, realizamos geralmente o incremento ou decremento da variável de controle (a variável comumente inicializada na Declaração de inicialização e usada na Condição de controle). Em todos os for do exemplo #1, a variável i é incrementada através do operador pré-fixado ++. É importante notar que a expressão de iteração é executada apenas no fim de cada iteração, ao contrário da condição de controle, que é executada no início de cada repetição do laço.

Contudo, apesar de ser utilizada sobretudo para incrementar e decrementar a “variável do for” (o i, nos nossos exemplos), a expressão de iteração também pode ser utilizada para outras finalidades. O único cuidado a se tomar é que não se deve esquecer de agir sobre as variáveis utilizadas na condição de controle – seja através de incrementos, decrementos, ou alguma outra operação -, caso contrário o laço será executado para sempre (ou até que o programa seja encerrado desde fora). Veja abaixo o exemplo de um for que rodará sem fim.


Exemplo 2 – Laço for sem fim

// A expressão de iteração foi deixada vazia,
// assim o loop não se encerrará nunca, pois o
// valor de i será sempre 0.
for(auto i = 0;i < 10;;) {
    std::cout << "Laço for sem fim..." << std::endl;
}

Percorrer os elementos de um vetor usando for em C++

Há ainda um formato dos for em C++ que não mencionei, mas que é bastante utilizado: o range-based for loop. Essa sobrecarga do for serve para percorrer os elementos de um container iterável, como os objetos do tipo vector, e é ainda mais compacta que o formato padrão do for. Vejamos abaixo um exemplo de utilização do range-based for para percorrer e imprimir na saída do programa os elementos de um vetor de inteiros.

Aos que desejam saber os detalhes acerca dessa variação dos laços for, eu os expliquei em detalhes no artigo Como percorrer um array em C++ – 3 principais maneiras.


Exemplo 3 – Percorrer um vetor usando range-based for em C++

#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<int> intVector = {1, 2, 3, 4, 5};

    // Range-based for loop usado para acessar os elementos do vetor.
    // Criei um tipo referência e não uma variável normal para evitar
    // copiar desnecessariamente o elemento do vetor (ainda que para
    // tipos "padrões" da linguagem isso seja desnecessário).
    for (const auto& valorInt : intVector)
    {
        cout << "Valor do elemento da vez: " << valorInt << endl;
    }

    return 0;
}

Valor do elemento da vez: 1
Valor do elemento da vez: 2
Valor do elemento da vez: 3
Valor do elemento da vez: 4
Valor do elemento da vez: 5


Conclusão

Neste artigo tratei dos laços de repetição for e de seu uso em casos diversos. Mostrei a sintaxe do for e também expliquei em detalhes cada um de seus elementos principais: a declaração de inicialização, a condição de controle e a expressão de iteração. Por fim, mostrei brevemente como se utilizam os range-based for loops para se percorrer os elementos de um container de modo bastante compacto, sem a necessidade de obter o tamanho de vetor e usar um contador para percorrer os seus elementos um a um, como em um for “clássico” (para saber ainda mais, consulte o nosso artigo Como percorrer um array em C++ – 3 principais maneiras ou a página do CppReference sobre o assuto).

Inscreva-se na nossa newsletter para não perder nenhum dos nossos artigos 🙂

Foto de perfil de Emanoel

Sou apaixonado por tecnologia, literatura e também filosofia. O cultivo dessas paixões ao longo da minha trajetória me inspiraram a compartilhar aquilo que aprendo com os outros da maneira mais clara que eu possa. Sou formado em Engenharia Elétrica no Brasil, e também sou engenheiro formado na França. Trabalho atualmente como programador C++ em uma multinacional francesa, uma das maiores empresas de TI do mundo.

Leave a Reply

Your email address will not be published. Required fields are marked *