Instrução for
A instrução de iteração for
é similar à while
, porém além de uma condição
várias funcionalidades podem ser embutidas entre os parênteses. Entre os
parênteses, podemos especificar três coisas:
- Uma ação inicial (e.g. definição e/ou inicialização de variáveis).
- Uma condição (assim como no
while
). - Uma ação intermediária (ocorre após cada iteração).
As expressões (ou, no caso de 1., definição) devem ser separadas por ponto e
vírgula. Vamos fazer um laço que conta de 0 a 10 com um for
, utilizando suas
três partes e um loop body:
- A definição e inicialização
int i = 0
. - A condição
i <= 10
. - O incremento
i = i + 1
. - O loop body que imprime o valor de
i
.
Isso é expresso da seguinte forma:
// ⬐ Definição ⬐ Incremento
for (int i = 0; i <= 10; i = i + 1)
// ⬑ Condição
printf("%d\n", i); // ← Loop body
Variáveis declaradas no for
são temporárias, ou seja, só podem ser acessadas
entre os parênteses e dentro do loop body.
Anteriormente, fizemos a soma dos valores de um array utilizando a instrução
while
. Vamos refazê-la, mas dessa ver usando for
:
int array[5] = {10, 5, 3, 5, 2};
int soma = 0;
for (int i = 0; i < 5; i = i + 1)
soma = soma + array[i];
Qualquer uma das três partes entre os parênteses de um for
pode ser omitida.
Caso a condição seja omitida, ela é substituída por alguma expressão true
.
Portanto o seguinte for
executa interminavelmente:
for (;;) // Equivalente a while (true)
puts("*");
O loop body de um for
ou while
pode ser uma instrução nula, i.e. um
simples ;
. Dessa forma, toda a lógica de um laço simples pode ser especificada
entre os parênteses da instrução:
int array[5] = {10, 5, 3, 5, 2};
int soma = 0;
for (int i = 0; i < 5; soma = soma + array[i], i = i + 1);
Isso soma os elementos do array assim como anteriormente, porém com loop body
nulo. Você pode ter percebido o uso da vírgula entre soma = soma + array[i]
e
i = i + 1
; o operador ,
(simplesmente "vírgula") é usado para compor uma
expressão a partir de duas, portanto soma = soma + array[i], i = i + 1
é
considerada uma só expressão e assim pode ser utilizada no for
. Na maioria dos
casos, fazer toda a lógica de um laço entre os parênteses piora a legibilidade
do código; faça apenas quando a concisão do código for crucial.
Referências
- ISO/IEC JTC1/SC22/WG14 N2310:
- 6.5.17 Comma operator
- 6.8.5 Iteration statements