LINGUAGEM: Linguagem C - Capítulo 1 - Parte 8



Controle de Fluxo: Laços e Desvios Incondicionais

Laços:

Em C, há três comandos de ITERAÇÃO ou LAÇOS:
  • for
  • while
  • do ... while
Estes permitem que um conjunto de instruções seja executado até que ocorra uma certa condição. Esta condição pode ser pré-definida (como no laço for) ou com o final em aberto (como nos laços while e do ... while).

Laço for:

FORMA GERAL
for( INICIALIZAÇÃO ;  CONDIÇÃO ; INCREMENTO )   COMANDO;
  • INICIALIZAÇÃO - geralmente um comando de atribuição para colocar um valor na variável de controle do laço;
  • CONDIÇÃO - é uma expressão relacional que determina quando o laço acaba;
  • INCREMENTO - define como a variável de controle do laço varia cada vez que o laço é repetido;
  • COMANDO - um único comando ou um bloco de comandos executados enquato a CONDIÇÃO é verdadeira.

VARIAÇÕES

1. Operador Vígula - uma das variações mais comuns é o uso do operador vírgula para permitir que duas ou mais variáveis controlem o laço:
for( x = 0 , y = 100 ; x < y ; x ++ , y -= x )
 printf("x = %i, y = %i\n",x,y);


2. Laço infinito - Nenhuma das três expressões que formam um laço for é obrigatória. Assim, você pode criar um laço infinito assim:

for ( ; ; ) 
  printf(" Laço infinito \n");

3. Laço sem corpo - Um comando pode ser vazio. Isso significa que o corpo do laço for (ou qualquer outro laço) também pode ser vazio.

int pausa ( unsigned long int   p) {
 for ( t = 0 ;  t < p ; t++ )   
                  ; 
}

Laço while

FORMA GERAL
while( CONDIÇÃO )
 COMANDO;
COMANDO é executado enquanto a CONDIÇÃO for verdadeira ( diferente de zero ); quando for falsa, o controle passa para a linha após COMANDO.

VARIAÇÕES

1. Laço infinito :

while ( 1 ) 
  printf(" Laço infinito \n");

2. Laço sem corpo.

int pausa ( unsigned long int   p) {
 while ( p-- )   
                  ; 
}

Laço do ... while

Ao contrário dos laços for e while, que testam a condição do laço no começo, o laço do ... while verifica a condição ao final do laço. Isso significa que um laço do ... while SEMPRE SERÁ EXECUTADO AO MENOS UMA VEZ.

FORMA GERAL
do  {
  COMANDO;
 } while( CONDIÇÃO );

Embora as chaves não sejam necessárias quando apenas um comando está presente, elas são geralmente usadas para evitar confusão (para você, não para o compilador) com o while.

O laço do ... while repete até que a CONDIÇÃO se torne falsa.

VARIAÇÕES

1. Laço infinito :

do{
  printf(" Laço infinito \n");
 } while ( 1 ) 

2. Laço sem corpo.

int pausa ( unsigned long int   p) {
 do {} while ( p-- ); 
}

Desvios Incondicionais:

  • return
  • goto
  • break
  • continue

O comando return

Este comando é usado para retornar de uma função. Ele é um comando de desvio porque faz com que a execução retorne (salte de volta) ao ponto em que a chamada à função foi feita.

Se return tem um valor associado a ele, esse valor é o valor de retorno da função. Se nenhum valor de retorno é especificado, assume-se que apenas lixo é retornado (alguns compiladores irão automaticamente retornar 0 se nenhum valor for especificado, mas não conte com isso).

FORMA GERAL
return  EXPRESSÃO;

O comando goto

Na programação estruturada, não há nenhuma situação que necessite do goto. No entanto, o goto é uma conveniência que, se usada com prudência, pode ser uma vantagem em certas situações.

FORMA GERAL
goto  RÓTULO;

 ...

 RÓTULO:

O comando goto requer um RÓTULO - um identificador válido seguido por dois-pontos).

O RÓTULO tem de estar na mesma função do goto que o usa — não é permitido desvios entre funções.

O RÓTULO pode vir antes, e não apenas depois, do comando goto.

laço infinito
LOOP:
  printf("laço infinito\n");
 goto LOOP;

O comando break

O comando break tem dois usos. Você pode usá-lo para terminar um case em um comando switch (vide aula Controle de Fluxo: Comandos de Seleção). Você pode também utilizá-lo para forçar uma terminação imediata de um laço, evitando o teste condicional normal do laço.

Quando o comando break é encontrado dentro de um laço, o laço é imediatamente terminado e o controle do programa retorna ao comando seguinte ao laço.

O comando continue

O comando continue trabalha de uma forma pouco parecida com a do comando break. Porém, em vez de forçar a terminação, continue força que ocorra a próxima iteração do laço, pulando qualquer código intermediário.

Para o laço for, o comando continue faz com que o incremento e o teste condicional sejam executados.

Para os laços while e do ... while, o controle do programa passa para o teste condicional.

int conta_espacos(const char * str) {
 int i = 0, nesp = 0;
 
 while ( str[i] ) {
  if ( str[i] != ' ' ) 
   continue;

  nesp ++;
 }

 return nesp;
}

Leitura Recomendada:

  • CCT capítulo 3
  • K&R capítulos 3

Bibliografia e fonte:

  • [CCT] Schildt, H. (1996) C, completo e total: 3a Ed.. São Paulo, Makron.
  • LP, UFMA; Coutinho, Lucian. Linguagem de programação para ciencia da computação da ufma.http://www.deinf.ufma.br/~lrc/2009.1/LP/
  • [K&R] KERNIGHAN, B. e RITCHIE, D. (1990) C, a linguagem de programação: padrão ANSI. Rio de Janeiro: Campus.
  • DEITEL, H. M. (1999) Como programar em C. Rio de Janeiro: LTC.
  • Módulo Consultoria e Informática (1989) Linguagem C: programação e aplicações. Rio de Janeiro: LTC.