
Passo 1 de 8
Transforme comparações em condições
Avalie comparações simples, reconheça limites inclusivos e evite trocar == por =.
Trilha de aprendizado · Nível 9 · Tutorial 5
Faça o firmware escolher comandos de saída a partir de condições e faixas numéricas, prevendo qual ramo será executado.
Transforme comparações em condições
Avalie comparações simples, reconheça limites inclusivos e evite trocar `==` por `=`. 2 min
Escolha um caminho com if e else
Escreva uma decisão de dois caminhos com if e else e preveja o comando aplicado ao LED. 3 min
Combine condições e defina faixas
Use operadores lógicos para construir condições de faixa claras, incluindo ou excluindo limites de forma explícita. 3 min
Entenda quando a avaliação para
Veja como o curto-circuito determina quais partes de uma condição composta são realmente avaliadas. 2 min
Organize alternativas com else if
Use uma cadeia if/else if/else para separar valores abaixo, dentro e acima de uma faixa sem deixar lacunas nos limites. 2 min
Rastreie decisões e o comando final do LED
Compare cadeias exclusivas e testes independentes para rastrear cada escrita e determinar o comando final do LED. 2 min
Verifique as decisões na sua placa
Teste localmente uma cadeia exclusiva de decisões por faixa usando o LED integrado do Uno R3. 3 min
Aplique e revise suas decisões
Aplique comparações, operadores lógicos e estruturas de decisão para validar uma regra completa de comando do LED. 2 min

Passo 1 de 8
Avalie comparações simples, reconheça limites inclusivos e evite trocar == por =.
Uma comparação pergunta se uma relação é verdadeira ou falsa. Em C/C++, seu resultado é um valor booleano: true ou false.
Com valores inteiros de tipos compatíveis, use:
== igual a!= diferente de< menor que<= menor ou igual a> maior que>= maior ou igual aPor exemplo, se temperatura vale 25, temperatura >= 20 resulta em true; temperatura < 20 resulta em false. Uma comparação não muda o valor da variável: ela apenas responde à pergunta feita pelo operador.

>= 20 inclui 20; > 20 exclui 20.
O sinal de igualdade aparece em duas tarefas diferentes:
contador = 3; é uma atribuição: grava 3 na variável.contador == 3 é uma comparação: verifica se o valor atual é 3 e produz true ou false.A comparação tem dois sinais de igual. Ao revisar uma expressão que deveria apenas verificar um valor, confira esse detalhe: trocar == por = pode alterar a variável e ainda permitir que o código seja compilado.
Considere int nivel = 7;. As seis primeiras linhas apenas comparam; a última altera a variável.
nivel == 7 // true
nivel != 7 // false
nivel < 10 // true
nivel <= 7 // true
nivel > 7 // false
nivel >= 10 // false
nivel = 3; // atribuição: agora nivel vale 3Dica
No valor-limite, a presença de = faz diferença: se nivel vale 7, nivel < 7 é false, enquanto nivel <= 7 é true. Escolha o operador de acordo com a regra: incluir ou excluir o limite.
Associe cada operador ao significado da comparação. Os operadores que contêm = incluem a igualdade no teste.
Faça as associações corretas.
Toque em um item e depois no par correspondente.
Agora avalie resultados que não estão resolvidos no código. Considere int leitura = 12; e determine a sequência de valores booleanos, na ordem das expressões:
leitura < 12leitura <= 12leitura != 9leitura > 15A primeira dupla mostra a diferença entre excluir e incluir exatamente o limite 12.
Qual é a sequência correta de resultados?
Complete apenas o operador que verifica se leitura é igual a 12. A variável não deve ser alterada.
Preencha a lacuna com o operador de igualdade.
int leitura = 12;
bool estaNoLimite = (leitura 12);
Passo 2 de 8
Escreva uma decisão de dois caminhos com if e else e preveja o comando aplicado ao LED.
Use if quando um comando deve ocorrer somente se a condição for verdadeira. A condição fica entre parênteses e o bloco que ela controla fica entre chaves.
Acrescente else quando houver uma alternativa para o caso falso. O firmware executa um dos blocos e, depois, continua na primeira instrução após as chaves.

A condição escolhe apenas um caminho; os dois voltam ao mesmo ponto do programa.
Considere valor já definido como um inteiro. Esta decisão comanda o LED integrado.
if (valor >= 10) {
digitalWrite(LED_BUILTIN, HIGH);
} else {
digitalWrite(LED_BUILTIN, LOW);
}Leia o código de cima para baixo:
valor >= 10 resultar em true, executa digitalWrite(..., HIGH).false, ignora o primeiro bloco e executa o bloco do else: digitalWrite(..., LOW).Não coloque ponto e vírgula entre if (condição) e {. As chaves devem vir logo em seguida.
Atenção
Evite isto:
if (valor >= 10); {
digitalWrite(LED_BUILTIN, HIGH);
}Esse ponto e vírgula termina o if com uma instrução vazia. O bloco entre chaves passa a executar sempre, independentemente da condição. Escreva if (condição) { sem ponto e vírgula no meio.
Complete as duas partes que tornam esta uma decisão completa: a condição do if e a palavra que inicia o caminho falso.
Preencha as lacunas.
if () {
digitalWrite(LED_BUILTIN, HIGH);
} {
digitalWrite(LED_BUILTIN, LOW);
}Sem else, uma condição falsa simplesmente não executa o bloco do if. Ela não cria, por conta própria, um comando LOW.
Suponha que o LED já foi comandado para HIGH antes deste trecho e que valor vale 3.
Trecho executado depois de o LED já estar em HIGH.
if (valor > 5) {
digitalWrite(LED_BUILTIN, LOW);
}Qual é o comando do LED depois desse trecho?

Passo 3 de 8
Use operadores lógicos para construir condições de faixa claras, incluindo ou excluindo limites de forma explícita.
Uma faixa numérica é definida por dois limites. Para verificar se valor está dentro da faixa de 10 a 20, incluindo as pontas, as duas comparações precisam ser verdadeiras:
(valor >= 10) && (valor <= 20)
&& significa “e”: exige as duas condições verdadeiras.|| significa “ou”: basta uma condição verdadeira.! significa “não”: inverte o resultado de uma condição.Use parênteses em cada comparação. Eles deixam claro o que está sendo comparado e tornam a condição mais fácil de revisar.

>= 10 e <= 20 incluem os limites. Já > 10 e < 20 excluem os limites.
Escolha o operador de comparação conforme a regra da faixa.
| Regra | Condição para valor = 10 | Condição para valor = 20 |
|---|---|---|
| Inclui os dois limites | valor >= 10 | valor <= 20 |
| Exclui os dois limites | valor > 10 | valor < 20 |
| Inclui só o limite inferior | valor >= 10 | valor < 20 |
| Inclui só o limite superior | valor > 10 | valor <= 20 |
Há três formas úteis de descrever a mesma região numérica:
(valor >= 10) && (valor <= 20).(valor < 10) || (valor > 20).!((valor >= 10) && (valor <= 20)).No último caso, os dois pares de parênteses mostram que ! nega o resultado da condição inteira, e não apenas uma das comparações.
Três formas de expressar regras para o mesmo valor.
int valor = 15;
bool dentro = (valor >= 10) && (valor <= 20);
bool fora = (valor < 10) || (valor > 20);
bool naoDentro = !((valor >= 10) && (valor <= 20));Atenção
Não escreva 10 <= valor <= 20. Em C/C++, isso não representa uma faixa matemática encadeada.
Escreva as duas comparações completas e una os resultados:
(valor >= 10) && (valor <= 20)
Assim, cada lado de && produz um resultado verdadeiro ou falso.
Complete os operadores lógicos para uma faixa inclusiva de 10 a 20.
int valor = 20;
bool dentro = (valor >= 10) (valor <= 20);
bool fora = (valor < 10) (valor > 20);
bool naoDentro = ((valor >= 10) && (valor <= 20));Associe cada valor à sua classificação para a condição (valor >= 10) && (valor <= 20).
Toque em um item e depois no par correspondente.

Passo 4 de 8
Veja como o curto-circuito determina quais partes de uma condição composta são realmente avaliadas.
Em uma condição composta, C/C++ avalia primeiro o operando à esquerda. Só então decide se precisa avaliar o operando à direita.
&&, se a parte esquerda for false, o resultado já será false. A parte direita é ignorada.||, se a parte esquerda for true, o resultado já será true. A parte direita é ignorada.Esse comportamento é chamado de curto-circuito. Quando não há curto-circuito, o operando direito é avaliado normalmente.

O primeiro resultado pode determinar a condição inteira e impedir a avaliação do operando direito.
Dica
Ignorada não significa “avaliada como falsa”. Compare:
(8 < 3) && (10 / 0 > 1): o lado esquerdo é false. O lado direito é ignorado; a divisão não ocorre.(8 > 3) && (2 < 1): o lado esquerdo é true. O lado direito é avaliado, resulta em false e torna a condição completa falsa.As duas condições completas resultam em false, mas o caminho de avaliação é diferente. Com ||, se o lado esquerdo for false, o lado direito precisa ser avaliado para decidir o resultado.
Para cada expressão, determine o que acontece com o operando da direita. Considere somente as comparações mostradas: não é necessário executar código na placa.
Na expressão (4 < 2) && (9 > 1), como fica o operando direito (9 > 1)?
Na expressão (4 > 2) && (9 < 1), como fica o operando direito (9 < 1)?
Na expressão (4 > 2) || (9 < 1), como fica o operando direito (9 < 1)?
Na expressão (4 < 2) || (9 > 1), como fica o operando direito (9 > 1)?
Para evitar uma divisão por zero, coloque a verificação do divisor à esquerda de &&. Se denominador for zero, denominador != 0 resulta em false; assim, a divisão à direita é ignorada.
Quando o denominador não é zero, o lado esquerdo é true e a divisão pode ser avaliada.
Condição usada antes de acender o LED quando a média inteira for maior que 3.
if ((denominador != 0) && (total / denominador > 3)) {
digitalWrite(LED_BUILTIN, HIGH);
}Atenção
Não inverta a condição:
(total / denominador > 3) && (denominador != 0)
Se denominador for zero, o programa tentará calcular a divisão antes de chegar à verificação. A proteção só funciona quando vem primeiro.
Complete a parte esquerda da condição. Ela deve impedir que soma / divisor seja avaliada quando divisor valer zero.
Preencha a condição de proteção.
if (() && (soma / divisor >= 5)) {
digitalWrite(LED_BUILTIN, HIGH);
}
Passo 5 de 8
Use uma cadeia if/else if/else para separar valores abaixo, dentro e acima de uma faixa sem deixar lacunas nos limites.
Quando há alternativas mutuamente exclusivas, encadeie if, else if e else. A cadeia é examinada de cima para baixo e executa somente o primeiro bloco cuja condição for verdadeira. Depois disso, os demais ramos são ignorados.
Para classificar leitura em relação à faixa inclusiva de 20 a 80:
O segundo teste pode ser apenas leitura <= 80: para alcançá-lo, o primeiro (leitura < 20) já foi falso. Logo, nesse ponto, sabemos que leitura >= 20.

Apenas um caminho é percorrido: o primeiro ramo cuja condição for verdadeira.
O else final não possui condição: ele atende qualquer valor que não tenha sido aceito pelos testes anteriores. As chaves deixam explícito qual comando pertence a cada ramo.
int leitura = 80;
if (leitura < 20) {
digitalWrite(LED_BUILTIN, LOW);
} else if (leitura <= 80) {
digitalWrite(LED_BUILTIN, HIGH);
} else {
digitalWrite(LED_BUILTIN, LOW);
}Rastreamento da cadeia para valores de fronteira e valores internos.
| leitura | 1º teste: < 20 | 2º teste: <= 80 | Ramo | LED |
|---|---|---|---|---|
| 19 | verdadeiro | — | if | LOW |
| 20 | falso | verdadeiro | else if | HIGH |
| 50 | falso | verdadeiro | else if | HIGH |
| 80 | falso | verdadeiro | else if | HIGH |
| 81 | falso | falso | else | LOW |
Complete as duas condições para acender o LED somente na faixa inclusiva de 20 a 80.
if () {
digitalWrite(LED_BUILTIN, LOW);
} else if () {
digitalWrite(LED_BUILTIN, HIGH);
} else {
digitalWrite(LED_BUILTIN, LOW);
}Considere esta cadeia:
if (leitura >= 20) {
digitalWrite(LED_BUILTIN, HIGH);
} else if ((leitura >= 20) && (leitura <= 80)) {
digitalWrite(LED_BUILTIN, HIGH);
} else {
digitalWrite(LED_BUILTIN, LOW);
}Qual afirmação descreve corretamente o efeito dessa ordem de testes?

Passo 6 de 8
Compare cadeias exclusivas e testes independentes para rastrear cada escrita e determinar o comando final do LED.
Até aqui, você usou uma cadeia if / else if / else para escolher um único ramo. Nela, assim que uma condição é verdadeira, as alternativas seguintes são ignoradas.
Já vários if separados são decisões independentes: cada condição é testada, mesmo que uma anterior tenha sido verdadeira. Por isso, mais de um bloco pode escrever no mesmo LED durante uma passagem por loop().
Quando a regra pede apenas uma classificação — por exemplo, abaixo, dentro ou acima de uma faixa — prefira a cadeia exclusiva. Use if independentes somente quando cada ação puder ocorrer junto das demais.

Em uma cadeia exclusiva, há um ramo escolhido. Em if independentes, pode haver várias escritas na mesma passagem.
Observe dois if independentes. Para valor = 12, as duas condições são verdadeiras. A execução segue de cima para baixo: primeiro o LED recebe HIGH; depois recebe LOW.
O comando final é, portanto, LOW, pois é a última escrita executada. Isso não apaga o fato de que o primeiro ramo também foi percorrido.
Dois testes independentes escrevem no mesmo LED.
int valor = 12;
if (valor >= 10) {
digitalWrite(LED_BUILTIN, HIGH);
}
if (valor <= 15) {
digitalWrite(LED_BUILTIN, LOW);
}Considere que o LED começou com comando LOW antes desses testes. Para valor = 12, qual rastreamento está correto?
Qual rastreamento está correto para valor = 12?
Uma tabela separa o caminho percorrido do estado final. Considere o comando inicial LOW e o código com os dois if independentes da tela anterior.
Rastreamento para três valores usando dois if independentes.
| valor | valor >= 10 | valor <= 15 | ramos executados | comando final |
|---|---|---|---|---|
| 8 | falso | verdadeiro | 2º if | LOW |
| 12 | verdadeiro | verdadeiro | 1º e 2º if | LOW |
| 20 | verdadeiro | falso | 1º if | HIGH |
Dica
Para valor = 8, apenas o segundo ramo é percorrido e o resultado é LOW. Para valor = 12, dois ramos são percorridos, mas o resultado final também é LOW.
Logo, observar o LED em LOW não identifica sozinho qual ramo ocorreu. Valores diferentes — e até percursos diferentes — podem terminar no mesmo comando.
Agora o LED recebe um comando inicial conhecido antes de duas decisões independentes.
int valor = 7;
digitalWrite(LED_BUILTIN, HIGH);
if (valor > 10) {
digitalWrite(LED_BUILTIN, LOW);
}
if (valor < 5) {
digitalWrite(LED_BUILTIN, LOW);
}Qual rastreamento descreve corretamente esse código?
Qual situação pede uma cadeia if / else if / else, e não dois if independentes?

Passo 7 de 8
Teste localmente uma cadeia exclusiva de decisões por faixa usando o LED integrado do Uno R3.
Nesta prática, use somente o LED integrado do Uno R3 e a alimentação USB. O programa classifica um valor inteiro como abaixo da faixa, dentro da faixa inclusiva ou acima dela. O LED acende somente no ramo central.
Os ramos “abaixo” e “acima” comandam LOW. Portanto, um LED apagado confirma que o valor está fora da faixa, mas não informa sozinho qual desses dois ramos ocorreu. Antes de olhar a placa, use o valor atribuído e as condições para prever o caminho.

Os valores 10 e 20 pertencem à faixa e devem comandar o LED para HIGH.
Dica
Antes de gravar, desconecte qualquer circuito externo que esteja nos pinos da placa. Esta prática não usa botão, sensor nem LED externo.
Crie um sketch local, substitua o conteúdo pelo código abaixo e grave-o no seu Uno R3. Em cada tentativa, altere somente a atribuição de valorTeste, salve, compile e grave novamente.
const int LIMITE_INFERIOR = 10;
const int LIMITE_SUPERIOR = 20;
const int valorTeste = 15;
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
if (valorTeste < LIMITE_INFERIOR) {
digitalWrite(LED_BUILTIN, LOW);
} else if ((valorTeste >= LIMITE_INFERIOR) &&
(valorTeste <= LIMITE_SUPERIOR)) {
digitalWrite(LED_BUILTIN, HIGH);
} else {
digitalWrite(LED_BUILTIN, LOW);
}
}Com valorTeste = 15, o LED integrado deve permanecer aceso (HIGH).
O LED integrado é a saída observável; o sketch não produz texto no Monitor Serial. Para o valor inicial 15, confira o LED integrado após a gravação.
Todos os ramos enviam um comando explícito ao LED. Assim, o resultado de cada gravação não depende de um comando anterior.
O valor inicial 15 está entre 10 e 20, incluindo os limites. Depois de confirmar esse caso, teste um valor por vez: altere a linha de valorTeste, salve, compile, grave e observe o LED.
Antes de consultar o gabarito ou gravar cada versão, complete a condição do ramo central. Ela deve aceitar os dois limites e os valores entre eles.
Preencha os operadores que tornam a faixa de 10 a 20 inclusiva.
else if ((valorTeste LIMITE_INFERIOR)
(valorTeste LIMITE_SUPERIOR)) {
digitalWrite(LED_BUILTIN, HIGH);
}Sem executar ainda os cinco casos, registre sua previsão para valorTeste = 9, 10, 15, 20 e 21. Para cada valor, indique o ramo — abaixo, central ou acima — e o comando esperado: HIGH ou LOW.
Use a sequência, por exemplo: 9: abaixo, LOW; 10: .... Depois grave uma versão por vez para comparar a previsão com a observação.
Escreva pelo menos 60 caracteres (0/60).
Compare agora suas previsões com este rastreamento. Os dois limites são inclusivos: tanto 10 quanto 20 alcançam o ramo central. Os valores 9 e 21 deixam o LED apagado, mas percorrem ramos diferentes.
| valorTeste | Ramo executado | Comando esperado |
|---|---|---|
| 9 | Abaixo da faixa | LOW |
| 10 | Central: limite inferior | HIGH |
| 15 | Central: dentro da faixa | HIGH |
| 20 | Central: limite superior | HIGH |
| 21 | Acima da faixa | LOW |
Após testar 9, 10, 15, 20 e 21, registre o que observou. Se houver divergência, confira se alterou valorTeste, salvou o arquivo, compilou e gravou a versão correspondente; confira também a placa e a porta selecionadas na IDE.
Relate os cinco estados e, se necessário, a verificação que você fez. Não é necessário enviar arquivos.
Escreva pelo menos 80 caracteres (0/80).

Passo 8 de 8
Aplique comparações, operadores lógicos e estruturas de decisão para validar uma regra completa de comando do LED.
Regra a implementar: acenda o LED integrado somente quando modo for igual a 1 e valor estiver de 20 a 30, incluindo 20 e 30. Em qualquer outro caso, apague o LED.
Há somente dois comandos finais possíveis: HIGH ou LOW. Por isso, uma condição composta seguida de if e else expressa a regra sem criar ramos concorrentes.
Antes de escrever, transforme a frase em testes: igualdade para o modo; >= para o limite inferior; <= para o superior.

Os pontos fechados nos extremos indicam que os valores-limite pertencem à faixa.
Complete os operadores para implementar a regra. Observe que a atribuição =, usada nas declarações, não serve para testar igualdade.
const int LIMITE_INFERIOR = 20;
const int LIMITE_SUPERIOR = 30;
int valor = 20;
int modo = 1;
bool modoAtivo = (modo 1);
bool naFaixa = (valor LIMITE_INFERIOR) &&
(valor LIMITE_SUPERIOR);
if (modoAtivo && naFaixa) {
digitalWrite(LED_BUILTIN, HIGH);
} else {
digitalWrite(LED_BUILTIN, LOW);
}A regra do LED possui dois resultados mutuamente exclusivos: acender ou apagar. Qual estrutura é a mais adequada para o código apresentado?
Associe cada caso ao resultado da condição composta, ao ramo executado e ao comando final do LED.
Toque em um item e depois no par correspondente.
Resumo
Para validar uma decisão no firmware:
if/else para dois resultados exclusivos, else if para classificações exclusivas ou if independentes para ações que podem coexistir.Comece com valores definidos no próprio sketch. Depois, uma leitura de entrada poderá fornecer o valor usado na decisão.
== compara; = atribui.>= e <=.&& exige que todas as condições sejam verdadeiras.else.Parabéns! Você concluiu: Decisões com if e else no firmware
Milhares de cursos online em vídeo, ebooks e áudiobooks.
Para testar seus conhecimentos no decorrer dos cursos online
Gerado diretamente na galeria de fotos do seu celular e enviado ao seu e-mail
Baixe nosso aplicativo pelo QR Code ou pelos links abaixo:.
+ de 10 milhões
de alunos
Certificado grátis e
válido em todo o Brasil
60 mil exercícios
gratuitos
4,8/5 classificação
nas lojas de apps
Cursos gratuitos em
vídeo, ebooks e audiobooks