C++: Instruções Condicionais
Última atualização: 2026-08-26
Nas aulas anteriores, os programas executavam de cima para baixo sem ramificações.
Mas programas reais precisam "tomar decisões" — por exemplo:
- Se a nota é >= 60, exibir "Aprovado"; caso contrário exibir "Reprovado"
- Se é fim de semana, sair para se divertir; caso contrário, estudar
É para isso que servem as instruções condicionais.
1. A Instrução if
(1) 1.1 Sintaxe Básica
if (condition) {
// código a executar quando a condição é verdadeira
}
Fluxo de execução:
- Avalia a
condition(deve ser tipoboolou conversível parabool) - Se
true, executa o código dentro das chaves - Se
false, pula
▶ Exemplo 1: Verificar Par ou Ímpar (Dificuldade ⭐)
#include <iostream>
int main() {
int num;
std::cout << "Please enter an integer: ";
std::cin >> num;
if (num % 2 == 0) {
std::cout << num << " is Even" << std::endl;
}
if (num % 2 != 0) {
std::cout << num << " is Odd" << std::endl;
}
return 0;
}
Saída:
Please enter an integer:
is Even
is Odd
Resultado da execução:
Please enter an integer: 7
7 is Odd
💡 Dica: O programa acima usa duas instruções if, mas poderia ser simplificado com if-else (veja a próxima seção).
2. A Instrução if-else
(1) 2.1 Sintaxe Básica
if (condition) {
// executa quando a condição é verdadeira
} else {
// executa quando a condição é falsa
}
Ponto-chave: Exatamente uma das duas ramificações será executada, nunca ambas e nunca nenhuma.
▶ Exemplo 2: Verificar Par ou Ímpar (Melhorado) (Dificuldade ⭐)
#include <iostream>
int main() {
int num;
std::cout << "Please enter an integer: ";
std::cin >> num;
if (num % 2 == 0) {
std::cout << num << " is Even" << std::endl;
} else {
std::cout << num << " is Odd" << std::endl;
}
return 0;
}
Saída:
Please enter an integer:
is Even
is Odd
(2) 2.2 Omitindo Chaves (Não Recomendado)
Se houver apenas uma instrução após if ou else, você pode omitir as chaves:
if (num % 2 == 0)
std::cout << "Even" << std::endl; // ✅ Apenas uma instrução, chaves podem ser omitidas
else
std::cout << "Odd" << std::endl;
💡 Porém! Isso é fortemente desencorajado — omitir chaves facilmente leva a erros:
if (num % 2 == 0)
std::cout << "Even" << std::endl;
std::cout << "This number is divisible by 2" << std::endl; // ❌ Esta linha sempre executa (a indentação te enganou)
Prática recomendada: Sempre use chaves, mesmo para uma única instrução.
3. A Cadeia if-else if-else
Quando há múltiplas condições para verificar, use else if:
if (condition1) {
// executa quando condition1 é verdadeira
} else if (condition2) {
// executa quando condition1 é falsa e condition2 é verdadeira
} else if (condition3) {
// executa quando condições 1 e 2 são falsas e condition3 é verdadeira
} else {
// executa quando nenhuma das condições acima é verdadeira
}
💡 Ponto-chave: Uma vez que uma condição é verdadeira, as ramificações else if e else subsequentes não serão executadas.
▶ Exemplo 3: Classificação de Notas (Dificuldade ⭐⭐)
#include <iostream>
int main() {
int score;
std::cout << "Please enter a score (0-100): ";
std::cin >> score;
if (score >= 90) {
std::cout << "Excellent! Grade: A" << std::endl;
} else if (score >= 80) {
std::cout << "Good! Grade: B" << std::endl;
} else if (score >= 70) {
std::cout << "Medium! Grade: C" << std::endl;
} else if (score >= 60) {
std::cout << "Pass! Grade: D" << std::endl;
} else {
std::cout << "Not Pass! Grade: F" << std::endl;
}
return 0;
}
Saída:
Please enter a score (0-100):
Excellent! Grade: A
Good! Grade: B
Medium! Grade: C
Pass! Grade: D
Not Pass! Grade: F
Resultado da execução:
Please enter a score (0-100): 85
Good! Grade: B
💡 Técnica: else if (score >= 80) inclui implicitamente a condição score < 90 (porque se score >= 90 fosse verdadeiro, o programa não chegaria a este ponto).
4. if Aninhado
Uma instrução if pode conter outro if dentro dela — isso é chamado de aninhamento.
▶ Exemplo 4: Verificador de Ano Bissexto (Dificuldade ⭐⭐)
#include <iostream>
int main() {
int year;
std::cout << "Please enter a year: ";
std::cin >> year;
if (year % 400 == 0) {
std::cout << year << " is a leap year" << std::endl;
} else {
if (year % 4 == 0) {
if (year % 100 != 0) {
std::cout << year << " is a leap year" << std::endl;
} else {
std::cout << year << " is not a leap year" << std::endl;
}
} else {
std::cout << year << " is not a leap year" << std::endl;
}
}
return 0;
}
Saída:
Please enter a year:
is a leap year
is a leap year
is not a leap year
is not a leap year
💡 Dica: Este programa pode ser simplificado usando operadores lógicos (aprendidos na Aula 04):
bool isLeapYear = (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
if (isLeapYear) {
std::cout << year << " is a leap year" << std::endl;
} else {
std::cout << year << " is not a leap year" << std::endl;
}
5. A Instrução switch-case
Quando a condição é uma comparação de igualdade inteira, você pode usar switch-case em vez de uma cadeia if-else if.
(1) 5.1 Sintaxe Básica
switch (expression) {
case value1:
// executa quando expression == value1
break;
case value2:
// executa quando expression == value2
break;
...
default:
// executa quando nenhuma das acima corresponde
break;
}
▶ Exemplo 5: Calculadora Simples (Dificuldade ⭐⭐)
#include <iostream>
int main() {
double num1, num2;
char op;
std::cout << "Please enter the first number: ";
std::cin >> num1;
std::cout << "Please enter an operator (+ - * /): ";
std::cin >> op;
std::cout << "Please enter the second number: ";
std::cin >> num2;
switch (op) {
case '+':
std::cout << num1 << " + " << num2 << " = " << num1 + num2 << std::endl;
break;
case '-':
std::cout << num1 << " - " << num2 << " = " << num1 - num2 << std::endl;
break;
case '*':
std::cout << num1 << " * " << num2 << " = " << num1 * num2 << std::endl;
break;
case '/':
if (num2 != 0) {
std::cout << num1 << " / " << num2 << " = " << num1 / num2 << std::endl;
} else {
std::cout << "Error: Divisor cannot be 0!" << std::endl;
}
break;
default:
std::cout << "Error: Unsupported operator!" << std::endl;
break;
}
return 0;
}
Saída:
Please enter the first number:
Please enter an operator (+ - * /):
Please enter the second number:
+ =
- =
* =
/ =
Error: Divisor cannot be 0!
Error: Unsupported operator!
(2) 5.2 O Papel do break
break é usado para sair da instrução switch. Se você esquecer de escrever break, o programa continuará executando o próximo case (isso é chamado de "fall-through").
int day = 2;
switch (day) {
case 1:
std::cout << "Monday" << std::endl;
// ❌ Sem break, continuará para o case 2
case 2:
std::cout << "Tuesday" << std::endl;
break;
case 3:
std::cout << "Wednesday" << std::endl;
break;
}
// Saída:
// Tuesday
💡 Dica: Às vezes usar fall-through intencionalmente pode simplificar o código (ex: múltiplos cases executando o mesmo código), mas adicione um comentário para explicar.
char grade = 'B';
switch (grade) {
case 'A':
case 'B': // Fall-through intencional: A e B executam o mesmo código
case 'C':
std::cout << "Passed!" << std::endl;
break;
case 'D':
case 'F':
std::cout << "Failed..." << std::endl;
break;
}
6. O Operador Condicional (Operador Ternário)
C++ tem uma "abreviação" para if-else chamada operador ternário.
(1) 6.1 Sintaxe Básica
condition ? expression1 : expression2
Significado: Se a condição for verdadeira, retorna o valor de expression1; caso contrário, retorna o valor de expression2.
▶ Exemplo 6: Encontrar o Valor Máximo (Dificuldade ⭐)
#include <iostream>
int main() {
int a = 10, b = 20;
int max = (a > b) ? a : b; // Se a > b é verdadeiro, max = a; caso contrário max = b
std::cout << "Maximum is: " << max << std::endl; // Saída: Maximum is: 20
return 0;
}
Saída:
Maximum is: 20
💡 Dica: O operador ternário é adequado para atribuições condicionais simples. Se a lógica for complexa, if-else é mais claro.
7. Prática: Jogo de Adivinhação de Números
▶ Exemplo 7: Adivinhe o Número (Dificuldade ⭐⭐)
#include <iostream>
#include <cstdlib> // Para rand() e srand()
#include <ctime> // Para time()
int main() {
// Usa tempo atual como semente aleatória (coberto em detalhes mais tarde)
std::srand(static_cast<unsigned int>(std::time(nullptr)));
int secretNumber = std::rand() % 100 + 1; // Gera número aleatório 1-100
int guess;
int attempts = 0;
std::cout << "========== Number Guessing Game ==========\n";
std::cout << "I'm thinking of a number from 1-100. Try to guess!\n\n";
do {
std::cout << "Please enter your guess: ";
std::cin >> guess;
attempts++;
if (guess > secretNumber) {
std::cout << "Too high!Try again。\n";
} else if (guess < secretNumber) {
std::cout << "Too low!Try again。\n";
} else {
std::cout << "\n🎉 Congratulations! You got it!\n";
std::cout << "You guessed " << attempts << " time。\n";
}
} while (guess != secretNumber);
return 0;
}
Saída:
========== Number Guessing Game ==========
I'm thinking of a number from 1-100. Try to guess!
Please enter your guess:
Too high!Try again。
Too low!Try again。
🎉 Congratulations! You got it!
You guessed times。
Resultado da execução:
========== Number Guessing Game ==========
I'm thinking of a number from 1-100. Try to guess!
Please enter your guess: 50
Too high!Try again。
Please enter your guess: 25
Too low!Try again。
Please enter your guess: 37
Too high!Try again。
Please enter your guess: 31
🎉 Congratulations! You got it!
You guessed 4 time。
💡 Dica: Este programa usa um loop do-while (coberto em detalhes na Aula 07) — você pode copiá-lo por enquanto e entender a abordagem geral.
❓ Perguntas Frequentes
P: Por que if (x = 5) não causa erro? R: A expressão de atribuição
x = 5tem o valor5(não-zero é tratado como verdadeiro), então a condição é sempre verdadeira. Técnica anti-bug: coloque a constante do lado esquerdo —if (5 = x)causará erro de compilação,if (5 == x)está correto. P: Posso escrever um inteiro diretamente após if? Tipo if (5)? R: Sim. Em C++, 0 é tratado como falso e não-zero como verdadeiro. Mas isso não é intuitivo e não é recomendado. P: switch-case pode verificar números de ponto flutuante? R: Não. A expressãoswitchdeve ser um tipo inteiro (int,char,enum). Para comparações de ponto flutuante, useif-else, e esteja atento a problemas de precisão de ponto flutuante. P: Por que minha cadeia if-else só executa o primeiro if? R: Geralmente a condição está errada ou há um problema de escopo de chaves. Dica de depuração: adicione marcadoresstd::coutem cada ramificação para ver qual o programa alcança.
📖 Resumo
ifverifica uma condição e executa quando verdadeiraif-elsetem duas ramificações; exatamente uma será executada- Cadeia
if-else if-elselida com múltiplas condições switch-caseé bom para comparações de igualdade inteira; não esqueçabreak- O operador ternário
? :é uma abreviação paraif-else - Atribuição
=e comparação==são diferentes — não os confunda!
📝 Exercícios
- Básico (Dificuldade ⭐): Escreva um programa que permita ao usuário digitar um inteiro e determine se é positivo, negativo ou zero.
Please enter an integer: -5
-5 isNegative number
-
Intermediário (Dificuldade ⭐⭐): Escreva um programa que permita ao usuário digitar um ano e determine se é bissexto.
-
Regra de ano bissexto: divisível por 4 mas não por 100, OU divisível por 400
-
Implemente usando
if-else -
Desafio (Dificuldade ⭐⭐⭐): Escreva um programa que implemente uma "calculadora simples":
-
Deixe o usuário digitar dois números e um operador (+ - * /)
-
Implemente usando
switch-case -
Se o divisor for 0, exiba um erro
-
Se o operador não for suportado, exiba um erro
-
Resultado da execução:
Please enter the first number: 10
Please enter an operator: /
Please enter the second number: 3
Result: 10 / 3 = 3.33333
- if verifica uma condição e executa bloco de código quando verdadeira
- if-else tem duas ramificações; exatamente uma será executada
- Cadeia if-else if-else lida com múltiplas condições
- switch-case lida com cenários de múltiplas ramificações inteiras
- Operador condicional ?: simplifica if-else simples
8. 🚀 Próximo Passo
Agora que você aprendeu instruções condicionais, a seguir vamos aprender estruturas de repetição (for, while, do-while) (Aula 07) — permitindo que programas repitam código sem precisar escrevê-lo 100 vezes manualmente!