Diferenças

Aqui você vê as diferenças entre duas revisões dessa página.

Link para esta página de comparações

Ambos lados da revisão anterior Revisão anterior
Próxima revisão
Revisão anterior
c:controle_de_fluxo [2023/08/03 16:39] mazieroc:controle_de_fluxo [2024/09/05 16:55] (atual) maziero
Linha 1: Linha 1:
 +====== Controle de fluxo em C ======
 +
 +{{ :c:program-bart.png?250|}}
 +
 +===== Decisões =====
 +
 +=== comando if ===
 +
 +<code c>
 +if (expression)
 +  command ;
 +</code>
 +
 +ou
 +
 +<code c>
 +if (expression)
 +{
 +  command ;
 +  command ;
 +  ...
 +}
 +</code>
 +
 +<note important>
 +O comando "if" pode testar qualquer expressão cujo resultado possa ser avaliada como número, sendo que 0 (zero) é considerado falso e não-zero é verdadeiro.
 +</note>
 +
 +Ifs aninhados:
 +
 +<code c>
 +if (expression1)
 +  if (expression2)
 +  {
 +    command ;
 +    command ;
 +    ...
 +  }
 +</code>
 +
 +=== Comando if-else ===
 +
 +<code c>
 +if (expression)
 +  command1 ; // <--- there is a semicolon here!
 +else
 +  command2 ;
 +</code>
 +
 +ou
 +
 +<code c>
 +if (expression)
 +{
 +  command1a ;
 +  command1b ;
 +  command1c ;    
 +}
 +else
 +{
 +  command2a ;
 +  command2b ;
 +}
 +</code>
 +
 +If-else aninhados:
 +
 +<code c>
 +if (expression1)
 +  if (expression2)
 +    command1 ;
 +  else
 +    command2 ;
 +else
 +  command3 ;
 +</code>
 +
 +<note important>
 +A cláusula ''else'' sempre se combina com o último ''if'' em aberto; caso se deseje forçar outra combinação, deve-se usar chaves ({...}) para organizar a abertura/fechamento dos comandos "if".
 +</note>
 +
 +=== Comando switch ===
 +
 +<code c>
 +switch (expression)
 +{
 +  case constant1:
 +    command1 ;
 +    ...
 +    break ;
 +  case constant2:
 +    command2 ;
 +    ...
 +    break ;
 +  case constant3:
 +  case constant4:
 +    command34a ;
 +    ...
 +    break ;
 +  ...
 +  default:
 +    commandNa;
 +    ...
 +    break ;
 +}
 +</code>
 +
 +Exemplo (contagem de carros):
 +
 +<code c>
 +ch = getchar();
 +
 +switch(ch)
 +{
 +  case 'C':
 +  case 'c':
 +    corsa++ ;
 +    break ;
 +  case 'P':
 +    prisma++ ;
 +    break ;
 +  case 'p':
 +    palio++ ;
 +    break ;
 +  default:
 +    outros++ ;
 +    break ;
 +}
 +</code>
 +
 +=== Comando condicional ternário ===
 +
 +A expressão
 +
 +<code c>
 +expression1 ? expression2 : expression3 ;
 +</code>
 +
 +é equivalente a 
 +
 +<code c>
 +if (expression1)
 +  expression2 ;
 +else
 +  expression3 ;
 +</code>
 +
 +Exemplo:
 +
 +<code c>
 +x = x < 5 ? x + 1 : 1 ;
 +</code>
 +
 +equivale a:
 +
 +<code c>
 +if (x < 5)
 +  x = x + 1 ;
 +else
 +  x = 1 ;
 +</code>
 +
 +===== Laços =====
 +
 +=== Comando while ===
 +
 +<code c>
 +while (expression)
 +  command ;
 +</code>
 +
 +ou
 +
 +<code c>
 +while (expression)
 +{
 +  command1 ;
 +  command2 ;
 +  ...
 +}
 +</code>
 +
 +Exemplo:
 +
 +<code c>
 +i = 0 ;
 +while (i < 100)
 +{
 +  printf ("i vale %d\n", i) ;
 +  i++ ;
 +}
 +</code>
 +
 +=== Comando do-while ===
 +
 +<code c>
 +do
 +  command ;
 +while (expression) ;
 +</code>
 +
 +ou
 +
 +<code c>
 +do
 +{
 +  command1 ;
 +  command2 ;
 +  ...
 +}
 +while (expression) ;
 +</code>
 +
 +Exemplo:
 +
 +<code c>
 +i = 100 ;
 +do
 +{
 +  printf ("i vale %d\n", i) ;
 +  i-- ;
 +}
 +while i ;
 +</code>
 +
 +=== Comando for ===
 +
 +<code c>
 +for (initializations; conditions; updates)
 +  command ;
 +</code>
 +
 +ou
 +
 +<code c>
 +for (initializations; conditions; updates)
 +{
 +  command1 ;
 +  command2 ;
 +  ...
 +}
 +</code>
 +
 +Exemplo: um laço de repetição com a variável de controle indo de 0 a 99:
 +
 +<code c>
 +for (i = 0; i < 100; i++)
 +  printf ("i vale %d", i) ;
 +</code>
 +
 +Deve-se observar que o comando ''for'' equivale a:
 +
 +<code c>
 +initializations;
 +while (conditions)
 +{
 +  command1 ;
 +  command2 ;
 +  ...
 +  updates ;
 +}
 +</code>
 +
 +Então o exemplo acima pode ser reescrito como:
 +
 +<code c>
 +i = 0 ;                     // inicialização
 +while (i < 100)             // condição
 +{
 +  printf ("i vale %d", i) ;
 +  i++ ;                     // update
 +}
 +</code>
 +
 +Uma forma peculiar uso do ''for'' é o laço infinito, que não tem inicialização, condição nem update:
 +
 +<code c>
 +for (;;)
 +{
 +}
 +</code>
 +
 +===== Desvios =====
 +
 +=== Comando break ===
 +
 +O comando ''break'' só é usado dentro de blocos ''switch'', ''do'', ''while'' ou ''for''. Ao ser acionado, ele salta a execução para o primeiro comando após o bloco atual.
 +
 +Exemplo:
 +
 +<code c>
 +for (;;)
 +{
 +  printf ("Aceita? (s/n) ") ;
 +  resp = getchar() ;
 +  if(resp == 's' || resp == 'n')
 +    break;
 +  printf ("\n") ;
 +}
 +// o break salta para cá 
 +</code>
 +
 +=== Comando continue ===
 +
 +O comando ''continue'' é usado em laços ''for'', ''do'' e ''while''. Ele interrompe a iteração atual e inicia a próxima iteração do laço onde se encontra.
 +
 +Exemplo:
 +
 +<code c>
 +int i;
 +
 +for (i = -10; i < 10; i++)
 +{
 +  if (i == 0)
 +    continue; // pula para a próxima iteração do laço
 +    
 +  printf("%f\n", 15.0/i);
 +  // ...
 +}
 +</code>
 +
 +=== Comando goto ===
 +
 +O comando ''goto'' permite saltar a execução para locais definidos por rótulos ou etiquetas (//labels//), como mostra o exemplo a seguir:
 +
 +<code c>
 +goto PARTE2;
 +
 +// ... (qualquer código)
 +
 +PARTE2:
 +i = 0 ;
 +// ...  
 +</code>
 +
 +<note warning>
 +O comando ''goto'' deve ser usado com muito cuidado, pois ele pode tornar o fluxo de execução muito complexo (e portanto mais sujeito a erros). Como regra geral, **evite utilizá-lo**, a não ser que seja absolutamente necessário.
 +</note>
 +
 +=== Comando return ===
 +
 +O comando ''return'' encerra a função atual e retorna ao ponto de onde ela foi chamada. Ele pode ser chamado em qualquer local da função, não necessariamente no final dela.
 +
 +Exemplo:
 +
 +<code c>
 +// compara dois inteiros "a" e "b", retornando:
 +//  +1 se a > b
 +//  -1 se a < b
 +//   0 se a = b
 +
 +int compara (int a, b)
 +{
 +  if (a > b)  return  1 ;
 +  if (a < b)  return -1 ;
 +  return  0 ;  // a == b
 +}
 +</code>
 +
 +=== Comando exit ===
 +
 +A função ''exit (int status)'' é provida pela biblioteca de sistema ''stdlib.h'' e permite o encerramento da aplicação. O status informado como parâmetro é devolvido ao sistema operacional (mais especificamente ao shell que lançou a aplicação).
 +
 +<code c>
 +exit (0) ;
 +</code>
 +
 +