Stoa :: C/C++ :: Fórum

Autor O laço for - Detalhes

Detalhe: Em C, existe a restrição de que a instrução de inicialização não pode ser uma declaração de variável. Em C++ isso é permitido.  De modo que a instrução

 

for (int a=0; a < 10; a++) { }

 

 

está errada em C, mas é correta em C++.

 

 

Detalhe: A instrução de inicialização na verdade pode ser composta de mais de uma instrução, desde que as instruções sejam separadas por vírgulas. Por exemplo:

 

 

for (a=0, b=34, c=67; a < 100; a++) { /* Instruções a serem executadas a cada interação */ }

 

 

é um laço for perfeitamente válido. Existem algumas restrições, por exemplo eu testei e no compilador gcc 4.1.2, em C não é permitido criar um laço for como uma instrução de inicialização, mas não sei dizer com certeza qual é o critério que diz que um certo tipo de instrução é permitido e qual não. Mas tendo em vista que se trata de um recurso da linguagem que pode facilmente tornar o código menos legível, recomendo aos programadores que se restrinjam a utilizar as instruções múltiplas na instrução de inicialização apenas quando se tratarem de instruções de atribuição de valor a variáveis, tal como ilustrado no exemplo acima.

 

 

Detalhe: assim como a instrução de inicialização, a condição de término pode ter mais de uma expressão, desde que separada por vírgulas. Entretanto, o valor de verdadeiro ou falso será dado exclusivamente pela última expressão, e portanto essas expressões "extras" não fazem sentido a menos que se saiba do detalhe seguinte.

 

 

Detalhe: a condição de término não precisa ser uma expressão, podendo ser também uma instrução. Neste caso, uma atribuição recebe valor falso caso o valor atribuído seja igual a zero, e verdadeiro em qualquer outra situação. No caso de uma chamada a função, se esta função for do tipo void haverá um erro, e caso ela seja numérica o valor será falso para zero e verdadeiro para qualquer outro valor. Caso a função retorne um tipo definido pelo usuário ocorrerá erro. Caso a condição de término seja uma variável, o valor será falso para zero e verdadeiro para qualquer outro valor.

 

 

Exemplo: Considerando estes dois detalhes, a seguinte instrução (que, note bem, é pouco legível) é possível em C++:

 

 

for (int a=0, int b=10; a*=b, b; b--); /* Você sabe dizer o que esta instrução calcula? */

 

 

Detalhe: qualquer uma das expressões dentro dos parênteses do laço for pode ser omitida. A omissão de cada parte terá efeitos diferentes: um laço for sem instrução de inicialização apenas não executa nada antes do percurso normal do laço. Um laço for sem condição de término é executado infinitamente, de modo que para que o programa tenha fim ele terá que ter dentro do laço for ao menos uma das seguintes instruções: break, return, goto ou uma chamada a função que execute uma dessas instruções implicitamente. Uma função sem instrução de incremento não executa nada ao final da execução do bloco e antes do teste da condicional, de modo que a modificação da variável testada deve ser feita dentro do corpo do laço for, ou por meio de algum recurso externo, como uma chamada a função que possua variável static. Observe que apesar de pdoerem ser omitidos todos os itens da instrução for, os pontos-e-vírgula devem comparecer obrigatoriamente.

 

 

Exemplo: a instrução seguinte cria um programa infinito! Se você deixar ser computador rodando esse programa, ele só irá parar quando acabar a luz!

 

for ( ; ; );

 

 

Exemplo: o for abaixo é ligeiramente diferente: ele é a maneira de se escrever com um for algo que seria mais razoável escrever usando while. Mas essa é uma característica importante dos controles de fluxo: praticamente tudo o que pode ser feito com uma estrutura pode ser feito com as outras. Somente uns poucos casos excepcionais exigem uma solução ou outra, especificamente; a maioria dos problemas que pode ser resolvidos com um for pode ser resolvida com um while e vice-versa.

 

 

/* Fazer alguma coisa repetidamente até que o usuário entre com o valor zero */

int a;

for ( ; ; ) {

   scanf("%d", &a);

   if ( a == 0 )

       break;

   /* Faz alguma coisa */

}

 

Exercício: escreva um programa que calcula a soma dos fatoriais dos primeiros números naturais até que essa soma seja maior que mil.

 

 

Desafio: escreva um laço for que calcula a soma dos quadrados dos 20 primeiros números naturais. Reescreva o laço sem usar nenhuma instrução no bloco.

Palavras-chave: for, laço for


<< Voltar aos tópicos Responder