Condicionais
Condicionais são como semáforos em um cruzamento — quando a condição é atendida, você segue por um caminho; caso contrário, por outro. Programas ganham inteligência através da tomada de decisões.
O comando if
if é o condicional mais fundamental. Quando a condição é verdadeira (não zero), o código dentro das chaves é executado; quando falsa (zero), é ignorado.
#include <stdio.h>
int main(void) {
int score = 95;
if (score >= 90) {
printf("Excellent!\n");
}
printf("Program continues\n");
return 0;
}
Excellent!
Program continues
if, as chaves podem ser omitidas. No entanto, é altamente recomendável sempre usar chaves para evitar erros de lógica ao adicionar comandos depois e esquecer de incluir as chaves.
O comando if-else
if-else oferece dois ramos: se a condição é verdadeira, o bloco if executa; se falsa, o bloco else executa. Um dos dois sempre será executado.
#include <stdio.h>
int main(void) {
int age = 16;
if (age >= 18) {
printf("You are an adult\n");
} else {
printf("You are a minor\n");
}
return 0;
}
You are a minor
O problema do else pendente
Quando múltiplos if estão aninhados, o else se emparelha com o if mais próximo:
#include <stdio.h>
int main(void) {
int a = 5, b = 0;
if (a > 10)
if (b > 0)
printf("A\n");
else
printf("B\n");
return 0;
}
Parece que o else se emparelha com o primeiro if, mas na verdade se emparelha com o segundo if, então nada é impresso. Adicionar chaves deixa o emparelhamento claro:
if (a > 10) {
if (b > 0) {
printf("A\n");
} else {
printf("B\n");
}
}
A cadeia if-else if-else
Quando múltiplas condições precisam ser verificadas em sequência, use else if para encadear vários ramos:
#include <stdio.h>
int main(void) {
int score = 78;
if (score >= 90) {
printf("Grade: A\n");
} else if (score >= 80) {
printf("Grade: B\n");
} else if (score >= 70) {
printf("Grade: C\n");
} else if (score >= 60) {
printf("Grade: D\n");
} else {
printf("Grade: F\n");
}
return 0;
}
Grade: C
As condições do else if são avaliadas de cima para baixo. Uma vez que uma condição é satisfeita, todos os ramos subsequentes são ignorados. A ordem das condições importa.
Condicionais aninhados
Um if pode ser aninhado dentro de outro if para uma lógica condicional mais refinada:
#include <stdio.h>
int main(void) {
int age = 25;
char gender = 'M';
if (age >= 18) {
if (gender == 'M') {
printf("Adult male\n");
} else {
printf("Adult female\n");
}
} else {
printf("Minor\n");
}
return 0;
}
Adult male
else if.
O comando switch-case
switch salta para o ramo case correspondente com base no valor de uma expressão inteira. É ideal para ramificações em valores discretos.
Sintaxe básica
switch (expression) {
case constant1:
statement;
break;
case constant2:
statement;
break;
default:
statement;
break;
}
#include <stdio.h>
int main(void) {
int day = 3;
switch (day) {
case 1: printf("Monday\n"); break;
case 2: printf("Tuesday\n"); break;
case 3: printf("Wednesday\n"); break;
case 4: printf("Thursday\n"); break;
case 5: printf("Friday\n"); break;
case 6: printf("Saturday\n"); break;
case 7: printf("Sunday\n"); break;
default: printf("Invalid day\n"); break;
}
return 0;
}
Wednesday
A importância do break
Após o switch encontrar um case correspondente, ele executa todos os comandos a partir daquele ponto até encontrar um break ou o fim do switch. Isso é chamado de "fall-through" (queda).
#include <stdio.h>
int main(void) {
int num = 2;
switch (num) {
case 1: printf("One\n");
case 2: printf("Two\n");
case 3: printf("Three\n");
default: printf("Default\n");
}
return 0;
}
Two
Three
Default
break é o erro mais comum em switch. A menos que esteja usando fall-through intencionalmente, sempre adicione break ao final de cada case.
Usando fall-through para mesclar ramos
Às vezes, múltiplos rótulos case precisam executar a mesma lógica. Você pode omitir o break deliberadamente:
#include <stdio.h>
int main(void) {
char grade = 'B';
switch (grade) {
case 'A':
case 'B':
case 'C':
printf("Pass\n"); break;
case 'D':
printf("Retake\n"); break;
case 'F':
printf("Fail\n"); break;
default:
printf("Invalid grade\n"); break;
}
return 0;
}
Pass
Limitações do switch
- A expressão deve ser do tipo inteiro (
int,char,enum, etc.); números de ponto flutuante e strings não são permitidos - O valor após
casedeve ser uma constante determinada em tempo de compilação, não uma variável - Os valores de
casenão devem ser duplicados
O operador condicional (ternário)
O operador condicional ?: pode substituir comandos if-else simples. Ele foi introduzido na aula 6; aqui estão mais exemplos de uso:
#include <stdio.h>
int main(void) {
int a = -5;
int abs_a = a >= 0 ? a : -a;
printf("|%d| = %d\n", a, abs_a);
int x = 10, y = 10;
printf("%s\n", x == y ? "Equal" : "Not equal");
return 0;
}
|-5| = 5
Equal
if-else.
Exemplo
Determine o tipo corporal com base no IMC, demonstrando lógica condicional de múltiplos ramos:
#include <stdio.h>
int main(void) {
double weight = 70.0;
double height = 1.75;
double bmi = weight / (height * height);
printf("BMI: %.1f\n", bmi);
if (bmi < 18.5) {
printf("Underweight\n");
} else if (bmi < 24.0) {
printf("Normal\n");
} else if (bmi < 28.0) {
printf("Overweight\n");
} else {
printf("Obese\n");
}
return 0;
}
BMI: 22.9
Normal
Exemplo
Implemente uma seleção de menu simples usando switch:
#include <stdio.h>
int main(void) {
int choice = 2;
printf("===== Menu =====\n");
printf("1. New Game\n");
printf("2. Continue\n");
printf("3. Settings\n");
printf("4. Exit\n");
printf("================\n");
printf("Your choice: %d\n", choice);
switch (choice) {
case 1: printf("Starting new game!\n"); break;
case 2: printf("Loading save...\n"); break;
case 3: printf("Opening settings\n"); break;
case 4: printf("Exiting game\n"); break;
default: printf("Invalid choice\n"); break;
}
return 0;
}
===== Menu =====
1. New Game
2. Continue
3. Settings
4. Exit
================
Your choice: 2
Loading save...
❓ Perguntas Frequentes
P: Quando as chaves podem ser omitidas após o
if? R: Sintaticamente, as chaves podem ser omitidas quando há apenas um comando após oif/else, mas é recomendável sempre usá-las para evitar bugs ao esquecer de adicioná-las quando mais comandos forem inseridos.
P: O
switchpode avaliar números de ponto flutuante ou strings? R: Não. Oswitchsó aceita expressões inteiras. Nem números de ponto flutuante nem strings funcionam. Para comparar strings, use uma cadeiaif-else if.
P: O ramo
defaultpode ser omitido? R: Sintaticamente sim, mas é recomendável mantê-lo para lidar com casos inesperados e evitar erros silenciosos de valores não tratados.
P: Qual a diferença entre
else ifeifaninhado? R:else ifé uma estrutura plana de múltiplos ramos mais fácil de ler;ifaninhado é hierárquico e adequado quando as condições dependem umas das outras. Eles são intercambiáveis — escolha o que for mais legível.
📖 Resumo
iftrata condições únicas,if-elseescolhe entre dois, eelse ifescolhe entre múltiplos ramos- Sempre use chaves para evitar problemas de else pendente e dificuldades futuras de manutenção
switché ideal para ramificações em valores inteiros discretos; não esqueça obreakem cadacase- O fall-through no
switchpode mesclar ramos, mas esquecer obreaké uma fonte comum de bugs - O operador ternário
?:é adequado para escolhas simples entre dois caminhos; useif-elsepara lógica complexa
📝 Exercícios
- Escreva um programa que leia um inteiro e determine se é positivo, negativo ou zero, imprimindo o resultado.
- Escreva um programa que leia um número de mês (1-12) e use
switchpara exibir a quantidade de dias daquele mês (considere ano não bissexto, então fevereiro tem 28 dias). - Escreva um programa que leia um caractere e determine se é uma letra maiúscula, uma letra minúscula, um dígito ou outro caractere.



