Compreendendo o fluxo de controle em C: lógica booleana e condicionais

10

C não executa código apenas linearmente. Faz escolhas. No centro de cada decisão tomada por um programa C está a expressão booleana. Esteja você usando uma instrução if ou um loop while, a lógica se resume a uma coisa: esta condição é verdadeira ou falsa?

Vejamos um exemplo básico.

Aqui, o programa pede entrada. Ele armazena esse número na variável b. Em seguida, ele verifica uma condição. A expressão booleana em questão é (b < 0). C avalia isso. Se o resultado for verdadeiro, o programa imprime “O valor é negativo”. Se for falso, o programa não faz nada. Fica em silêncio.

A regra é simples. Se a expressão for avaliada como True, C executa a única linha imediatamente após o if. Ou, se você usar colchetes {}, ele executa todo o bloco dentro dele. Se a expressão for False, C ignora totalmente essa linha ou bloco.

Mas os programas raramente lidam com apenas um resultado. Freqüentemente, você também precisa lidar com zero ou números positivos.

Esta estrutura usa else if e else para cobrir os casos restantes. Ele testa zero a seguir. Se isso falhar, ele assume que o valor é positivo.

Às vezes, as decisões ficam complicadas. Talvez seja necessário verificar várias condições de uma só vez.

Esta declaração parece linguagem natural. Se x for igual a y E j for maior que k, então defina z como 1. Caso contrário, defina q como 10. Você usará esses tipos de declarações ao longo de sua carreira em C. A maioria das decisões será simples. Ocasionalmente, eles ficarão complexos.

Preste muita atenção à sintaxe. Uma armadilha comum para iniciantes é confundir tarefa com comparação.

C usa == para testar a igualdade.
C usa = para atribuir um valor a uma variável.

Misturá-los causa bugs difíceis de encontrar. Um define um valor. O outro verifica uma condição. Eles não são intercambiáveis.

C também depende de operadores específicos para operações lógicas. O símbolo && representa uma operação booleana AND. Isso garante que ambos os lados da condição sejam verdadeiros.

Aqui está uma referência rápida para todos os operadores booleanos em C:

  • == : igualdade
  • != : desigualdade
  • < : menos que
  • > : maior que
  • <= : menor ou igual a
  • >= : maior que

Lógica de loop em C: while, do-while e for

Usar um loop while é simples. Ele reflete a simplicidade de uma instrução if padrão. Considere este trecho:

enquanto (a < b) { printf("%d\n", a); uma = uma + 1; }

Essa estrutura executa repetidamente as duas linhas dentro dos colchetes. Ele para apenas quando a é maior ou igual a b. A lógica é linear. Verifique a condição. Executar corpo. Repita.

C também oferece uma construção do-while. Ao contrário do loop while padrão, este verifica a condição após a primeira execução. Isso garante que o bloco de código seja executado pelo menos uma vez.

Nota: O exemplo acima usa uma instrução if dentro da função. Um verdadeiro do-while envolveria o corpo e verificaria a condição no final.

O loop for como uma abreviação

O for loop é essencialmente uma instrução while compactada. Ele agrupa inicialização, teste e incremento em uma linha.

Veja este loop while padrão:

x=1;
enquanto (x<10) { blá, blá, blá x++; // x++ é idêntico a x=x+1 }

Você pode reescrever isso como um loop for:

for(x=1; x<10; x++) { blá, blá, blá }

Os componentes são claros. x=1 inicializa. x<10 testes. x++ incrementos. O loop for apenas os condensa. Você não está limitado a variáveis ​​simples. Você pode incluir lógica complexa nesses slots.

Veja este exemplo:

uma=1;
b=6;
enquanto (a < b) { um++; printf("%d\n",a); }

Torna-se:

for (a=1,b=6; a < b; a++,printf("%d\n",a));

Funciona. Também é confuso. O operador vírgula permite múltiplas instruções nas seções de inicialização e incremento. Não funciona na seção de teste. Muitos desenvolvedores C adoram essa compacidade. Outros acham que é ilegível. Eles terminam. Ambas as abordagens são válidas. Escolha com base em quem manterá o código posteriormente.

O perigo de = vs. == em C

O operador == causa dores de cabeça. Os desenvolvedores frequentemente digitam um único = por engano em expressões booleanas. O compilador aceita ambos. O comportamento difere muito.

Em C, as expressões booleanas são avaliadas como números inteiros. Zero é falso. Qualquer número inteiro diferente de zero é verdadeiro. Isso significa que qualquer número inteiro pode existir dentro de um contexto booleano.

Considere este código C legal:

if (a) { printf("Diferente de zero"); }

Se a for qualquer coisa menos 0, o bloco será executado.

Agora veja se (a=b). Isso não compara valores. Ele atribui b a a e testa o novo valor de a. Se b for 0, a condição será Falsa. Se b for qualquer outra coisa, é Verdadeiro. A variável a muda. Provavelmente não é isso que você pretendia. Você provavelmente quis dizer == para comparação.

Este recurso não é inútil. Possui casos de uso válidos. Mas é uma armadilha. Tenha cuidado com seu uso de = e ==. Um personagem muda a lógica da comparação para a atribuição.