====== Controle de fluxo em C ====== {{ :c:program-bart.png?250|}} ===== Decisões ===== === comando if === if (expression) command ; ou if (expression) { command ; command ; ... } 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. Ifs aninhados: if (expression1) if (expression2) { command ; command ; ... } === Comando if-else === if (expression) command1 ; // <--- there is a semicolon here! else command2 ; ou if (expression) { command1a ; command1b ; command1c ; } else { command2a ; command2b ; } If-else aninhados: if (expression1) if (expression2) command1 ; else command2 ; else command3 ; 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". === Comando switch === switch (expression) { case constant1: command1 ; ... break ; case constant2: command2 ; ... break ; case constant3: case constant4: command34a ; ... break ; ... default: commandNa; ... break ; } Exemplo (contagem de carros): ch = getchar(); switch(ch) { case 'C': case 'c': corsa++ ; break ; case 'P': prisma++ ; break ; case 'p': palio++ ; break ; default: outros++ ; break ; } === Comando condicional ternário === A expressão expression1 ? expression2 : expression3 ; é equivalente a if (expression1) expression2 ; else expression3 ; Exemplo: x = x < 5 ? x + 1 : 1 ; equivale a: if (x < 5) x = x + 1 ; else x = 1 ; ===== Laços ===== === Comando while === while (expression) command ; ou while (expression) { command1 ; command2 ; ... } Exemplo: i = 0 ; while (i < 100) { printf ("i vale %d\n", i) ; i++ ; } === Comando do-while === do command ; while (expression) ; ou do { command1 ; command2 ; ... } while (expression) ; Exemplo: i = 100 ; do { printf ("i vale %d\n", i) ; i-- ; } while i ; === Comando for === for (initializations; conditions; updates) command ; ou for (initializations; conditions; updates) { command1 ; command2 ; ... } Exemplo: um laço de repetição com a variável de controle indo de 0 a 99: for (i = 0; i < 100; i++) printf ("i vale %d", i) ; Deve-se observar que o comando ''for'' equivale a: initializations; while (conditions) { command1 ; command2 ; ... updates ; } Então o exemplo acima pode ser reescrito como: i = 0 ; // inicialização while (i < 100) // condição { printf ("i vale %d", i) ; i++ ; // update } Uma forma peculiar uso do ''for'' é o laço infinito, que não tem inicialização, condição nem update: for (;;) { } ===== 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: for (;;) { printf ("Aceita? (s/n) ") ; resp = getchar() ; if(resp == 's' || resp == 'n') break; printf ("\n") ; } // o break salta para cá === 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: 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); // ... } === 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: goto PARTE2; // ... (qualquer código) PARTE2: i = 0 ; // ... 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. === 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: // 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 } === 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). exit (0) ;