Artigo original: If...Else Statement in C Explained
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 OPERADOR | USO | RESULTADO |
---|---|---|
Igual a | a == b | Verdadeiro se a é igual a b , senão é falso |
Diferente de | a != b | Verdadeiro se a for diferente de b , senão é falso |
Maior que | a > b | Verdadeiro se a for maior que b , senão é falso |
Maior que ou igual a | a >= b | Verdadeiro se a for maior que ou igual a b , senão é falso |
Menor que | a < b | Verdadeiro se a for menor que b , senão é falso |
Menor que ou igual a | a <= b | Verdadeiro 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 OPERADOR | USO | RESULTADO |
---|---|---|
Não (! ) | !(a == 3) | Verdadeiro se a is não for igual a 3 |
E (&& ) | a == 3 && b == 6 | Verdadeiro se a for igual a 3 e b for igual a 6 |
Ou (|| ) | a == 2 || b == 4 | Verdadeiro 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.