Artigo original: If...Else Statement in C Explained
Traduzido e adaptado por Daniel Rosa

O fluxo de código condicional é a capacidade de alterar o modo como um trecho de código se comporta com base em certas condições. Para situações assim, você pode usar instruções if.

A instrução if também é conhecida como instrução de tomada de decisão, pois ela faz a tomada de decisão com base em determinada condição ou expressão. O trecho de código dentro de uma instrução if é executado se a condição for avaliada como verdadeira. No entanto, o código dentro das chaves é desconsiderado se a condição for avaliada como falsa. Nesse caso, o código após a instrução if (após o que vai entre as chaves) é executado.

Sintaxe de uma instrução if

if (condiçãoDeTeste) {
   // instruções
}

Um exemplo simples

Vamos examinar um exemplo na prática:

#include <stdio.h>
#include <stdbool.h>

int main(void) {
    if(true) {
        printf("A instrução é verdadeira!\n");
    }

    return 0;
}

Resultado:

A instrução é verdadeira!

Se o código dentro dos parênteses da instrução if for verdadeiro, tudo dentro das chaves também o será e será executado. Neste caso, true avalia como verdadeiro, fazendo com que o código execute a função printf, que imprime uma frase na tela.

Instruções if..else

Em uma instrução if...else, se o código dentro dos parênteses da instrução if for verdadeiro, o código dentro das chaves será executado. Porém, se o que estiver dentro do parênteses da instrução if for falso, todo o código dentro das chaves da instrução else será executado no lugar.

Logicamente, o exemplo acima não é muito útil, já que true sempre é avaliado como verdadeiro. Vejamos, então, um outro exemplo mais prático:

#include <stdio.h>

int main(void) {
    int n = 2;

    if(n == 3) { // comparando n com 3
        printf("A instrução é verdadeira!\n");
    } 
    else { // se a primeira condição não for verdadeira, execute este trecho de código
        printf("A instrução é falsa!\n");
    }

    return 0;
}

Resultado:

A instrução é falsa!

Vemos algumas diferenças importantes aqui. Primeiro, stdbool.h não foi incluído. Não há problema nisso, já que true e false não estão sendo usados como no primeiro exemplo. Em C, como em outras linguagens de programação, você pode usar instruções para que sejam avaliadas como verdadeiras ou falsas em vez de usar os valores booleanos true ou false diretamente.

Perceba, também, a condição dentro dos parênteses da instrução if: n == 3. Essa condição compara n e o número 3. == é um operador de comparação, um dos vários operadores desse tipo em C.

if...else aninhados

A instrução if...else permite que uma escolha seja feita entre duas possibilidades. Há vezes, no entanto, em que você precisa escolher entre três ou mais possibilidades.

Por exemplo, a função sign (sinal), na matemática, retorna -1 se o argumento for inferior a zero, +1 se for maior que zero e 0 se o argumento for zero.

O código abaixo implementa essa função:

if (x < 0)
   sign = -1;
else
   if (x == 0)
      sign = 0;
   else
      sign = 1;

Como é possível ver, uma segunda instrução if...else está aninhada dentro da instrução else do primeiro bloco de if..else.

Se x for menor que 0, sign é definido como -1. Se x não for inferior a 0, porém, a segunda instrução if...else é executada. Lá, se x for igual a 0, sign é definido como 0. Do contrário, x é maior que 0, e sign é definido como 1.

Em vez de instruções if...else aninhadas, os iniciantes geralmente usam uma sequência de instruções if:

if (x < 0) {
   sign = -1;
}
   
if (x == 0) {
   sign = 0;
}
   
if (x > 0) {
   sign = 1;
}

Embora isso funcione, não é recomendado, já que não é certo que somente uma das instruções (sign = ...) deva ser executada dependendo do valor de x. Também não é muito eficaz – toda vez que o código for executado, todas as três condições serão testadas, mesmo que uma ou duas não precisem ser.

Instruções else...if

As instruções else...if são alternativas a uma sequência de instruções if. Considere o código a seguir:

#include <stdio.h>

int main(void) {
    int n = 5;

    if(n == 5) {
        printf("n é igual a 5!\n");
    } 
    else if (n > 5) {
        printf("n é maior que 5!\n");
    }

    return 0;
}

Resultado:

n é igual a 5!

Se a condição para a instrução if for avaliada como falsa, a condição para a instrução else...if é verificada. Se a condição dessa instrução for avaliada como verdadeira, o código dentro das chaves da instrução else...if é executado.

Operadores de comparação

NOME DO OPERADORUSORESULTADO
Igual aa == bVerdadeiro se a é igual a b, senão é falso
Diferente dea != bVerdadeiro se a for diferente de b, senão é falso
Maior quea > bVerdadeiro se a for maior que b, senão é falso
Maior que ou igual aa >= bVerdadeiro se a for maior que ou igual a b, senão é falso
Menor quea < bVerdadeiro se a for menor que b, senão é falso
Menor que ou igual aa <= bVerdadeiro se a for menor que ou igual a b, senão é falso

Operadores lógicos

Podemos querer que um trecho de código seja executado se algo não for verdadeiro ou se duas coisas forem verdadeiras. Para isso, temos os operadores lógicos:

NOME DO OPERADORUSORESULTADO
Não (!)!(a == 3)Verdadeiro se a is não for igual a 3
E (&&)a == 3 && b == 6Verdadeiro se a for igual a 3 e b for igual a 6
Ou (||)a == 2 || b == 4Verdadeiro se a for igual a 2 ou b for igual a 4

Por exemplo:

#include <stdio.h>

int main(void) {
    int n = 5;
    int m = 10;

    if(n > m || n == 15) {
        printf("Ou n é maior que m, ou n é igual a 15\n");
    } 
    else if( n == 5 && m == 10 ) {
        printf("n é igual a 5 e m é igual a 10!\n");
    } 
    else if ( !(n == 6)) {
        printf("Não é verdade que n seja igual a 6!\n");
    }
    else if (n > 5) {
        printf("n é maior que 5!\n");
    }

    return 0;
}

Output:

n é igual a 5 e m é igual a 10!

Uma observação importante sobre as comparações em C

Embora tenhamos mencionado antes que cada comparação está verificando se algo é verdadeiro ou falso, isso é apenas parcialmente verdadeiro. O C é uma linguagem bastante leve e próxima ao hardware que a está executando. Com o hardware. é fácil verificar se algo é 0 ou false, mas qualquer outra coisa fica mais difícil.

Em vez disso, é muito mais preciso dizer que as comparações são, de fato, uma verificação se algo é 0/false, ou se são algum outro valor diferente.

Por exemplo, essa instrução if é verdadeira e válida:

if(12452) {
    printf("Isso é verdadeiro!\n")
}

Por padrão, 0 é false, e, por convenção, 1 é true. De fato, vamos ver a biblioteca stdbool.h:

#define false   0
#define true    1

Embora sejam um pouco mais do que isso, essa é a lógica central do funcionamento dos booleanos e o modo como as bibliotecas operam. Essas duas linhas instruem o compilador a substituir a palavra false por 0 e a palavra true por 1.