Expressões aritméticas, relacionais e lógicas

Tópicos e Objetivos

Ao final desse capítulo você deverá ser capaz de:

  • calcular o resultado de expressões
    • aritméticas

    • relacionais

    • lógicas

  • escrever expressões corretas usando:
    • operadores aritméticos

    • operadores lógicos

    • operadores relacionais

    • combinações desses operadores

Introdução

Vimos que uma parte importante do funcionamento de computadores é a sua capacidade de realizar cálculos, semelhante a uma calculadora. Antes de escrever programas, precisamos entender como essa “calculadora” funciona e treinar o seu uso até conseguirmos usá-la muito bem, ou seja, até que você consiga prever o valor devolvido pelo computador para expressões complexas. Provavelmente você vai encontrar situações que pareçam ambíguas no início e, nesses casos, sugerimos que você utilize o Python shell para verificar qual o comportamento do Python nessas situações.

Uma regra básica é que toda expressão calculada pelo computador deve sempre devolver o mesmo resultado. Por exemplo, a expressão 2 + 3 * 4 poderia devolver o valor 20 caso a soma 2+3 seja calculada antes da multiplicação. Felizmente o Python segue as regras de precedência dos operadores que nós estamos acostumados e o resultado devolvido é 14. Faça um teste você mesmo digitando essa expressão no Python shell como:

>>> 2+3*4
14

Além de entender como o Python resolve as expressões aritméticas, vamos ver também nesse capítulo como trabalhar com expressões lógicas e relacionais. Vamos começar com uma revisão sobre expressões aritméticas.

Expressões aritméticas

Uma expressão aritmética é formada por números (chamados de operandos) e operadores. Na sua forma mais simples, uma expressão contém apenas um número. Assim, o valor da expressão com apenas um número é o próprio número. Veja o que acontece quando digitamos apenas um número na linha de comando do Python shell:

>>> 5
5
>>> 21
21

Quando uma expressão contém um operador como + (soma), a “calculadora” deve realizar a operação usando os operandos fornecidos como no exemplo:

>>> 5 + 2
7
>>> 21 / 3
7

Podemos dizer que o Python reduz uma expressão a um valor. No caso de um número, não há o que ser reduzido, e o resultado é o próprio número. No caso de uma soma como 5+2, os dois números são somados e reduzidos ao valor 7. Como a calculadora (computador) só consegue reduzir um operador por vez, como ela resolve uma expressão com vários operadores como 2+3*4?

Teste o seu conhecimento

Procure prever o resultado das expressões respondendo essas questões antes de testá-las no Python shell.

    Q-1: Qual o valor da expressão: 2 + 3 * 4 - 5

  • -1
  • Incorreto: existe um padrão para cálculo de expressões que é obedecido pelos computadores onde a multiplicação tem precedência sobre a adição e subtração.
  • -5
  • Incorreto: existe um padrão para cálculo de expressões que é obedecido pelos computadores onde a multiplicação tem precedência sobre a adição e subtração.
  • 9
  • Correto.
  • 15
  • Incorreto: existe um padrão para cálculo de expressões que é obedecido pelos computadores onde a multiplicação tem precedência sobre a adição e subtração.

    Q-2: Qual o valor da expressão: 2 + 3 * (4 - 5)

  • 15
  • Incorreto: é necessário calcular a expressão entre parênteses primeiro.
  • 9
  • Incorreto: é necessário calcular a expressão entre parênteses primeiro.
  • -5
  • Incorreto: é necessário calcular a expressão entre parênteses primeiro.
  • -1
  • Correto.

Digite agora essas expressões no Python shell para conferir o resultado. Esperamos que você tenha acertado essas questões pois o Python segue as mesmas as regras para cálculo de expressões que você aprendeu nos cursos de matemática.

Erros de sintaxe

Lembre-se que o Python shell é um ambiente interativo que espera um ENTER para executar o que foi digitado na linha de comando e imprime o resultado. No caso de expressões aritméticas, uma expressão válida (mesmo que longa) é “reduzida” a um valor. Expressões inválidas geram mensagens de erro como:

>>> 2 +
File "<stdin>", line 1
    2 +
       ^
SyntaxError: invalid syntax

Nesse exemplo, como a soma precisa de dois operandos e apenas um foi fornecido, o Python indica um erro de sintaxe (SyntaxError). Preste bastante atenção nas mensagens pois elas indicam inclusive o local provável onde o erro aconteceu.

Assim, para prever o resultado de uma expressão com vários operadores, além de conhecer o que cada operador faz (como soma e multiplicação), é necessário conhecer as regras de precedência dos operadores e também sua associatividade.

Exemplos para entender o que é precedência e associatividade

As regras de precedência indicam qual operador é calculado primeiro. Por exemplo, qual o resultado da expressão 2 - 3 * 4?

Como a multiplicação tem maior prioridade que a subtração, o produto 3*4 é reduzido ao valor 12 e a seguir se calcula o valor da subtração 2 - 12, resultando em -10.

As regras de associatividade indicam a ordem dos cálculos para operadores que tenham a mesma precedência. Por exemplo, qual o resultado da expressão 2 - 3 + 4?

Como a soma tem a mesma prioridade que a subtração, precisamos aplicar a regra de associatividade. Em Python, a maioria dos operadores binários (que usam dois operandos) tem associatividade “da esquerda para a direita” (ou seja, as operações são realizadas na mesma ordem de leitura). A expressão portanto é primeiramente reduzida a -1 + 4 resolvendo a subtração e depois reduzida ao valor 3 resolvendo a soma. Observe que, caso a soma 3+4 fosse calculada primeiro, o resultado final seria -5 = 2-(3+4).

A tabela a seguir mostra a associatividade das principais operações aritméticas em Python, em ordem decrescente de precedência (da maior para a menor):

Tabela de precedência e associatividade de operadores aritméticos

Operador

descrição

Associatividade

()

parênteses

da esquerda para a direita

**

potência

da direita para a esquerda

+, -

positivo e negativo unário

da direita para a esquerda

*, /, //, %

multiplicação , divisão, divisão inteira e resto

da esquerda para a direita

+, -

soma e subtração

da esquerda para a direita

Observações:

  • Níveis de precedência:
    • A tabela mostra que há grupos de operadores com o mesmo nível, como soma e subtração.

    • Quanto mais “alto” o nível na tabela, maior a precedência.

  • Operadores com mesmo nível de precedência são resolvidos segundo a sua associatividade.
    • exemplo: para reduzir a expressão 12 / 2 / 3 / 4, o Python calcula 12/2, e segue dividindo o resultado por 3 e depois por 4.

  • Os operadores unários (+ e -) tornam explícitos o sinal do operando.
    • experimente colocar uma sequência de operadores unários como -+-+3 para ver o que acontece (será que resulta em erro de sintaxe?).

  • Use parênteses caso deseje alterar a precedência ou torná-la explícita
    • exemplo: 12 / 2 / 3 / 4 => 0.5

    • exemplo: (12 / 2) / ( 3 / 4) => 8.0

Teste o seu conhecimento

Qual o valor resultante das seguintes expressões:

    Q-3: Qual o valor da expressão: 12 * 2 % 10

  • 0
  • Incorreto: A expressão é calculada da esquerda para a direita como (12 * 2) % 10
  • 1
  • Incorreto: A expressão é calculada da esquerda para a direita como (12 * 2) % 10
  • 4
  • Resposta correta.
  • 2.4
  • Incorreto. O operador `%` calcula o resto da divisão.
  • nenhuma das alternativas anteriores
  • Incorreto, ao menos uma das alternativas anteriores está correta.

    Q-4: Qual o valor da expressão: 4 * 3 ** 2 // 10

  • 3
  • Resposta correta.
  • 3.6
  • Incorreto: O operador `//` faz divisão inteira.
  • 14
  • Incorreto: O operador `**` tem precedência maior que multiplicação e divisão.
  • 14.4
  • Incorreto. O operador `//` faz divisão inteira e sua precedência é menor que `**`.
  • nenhuma das alternativas anteriores
  • Incorreto, ao menos uma das alternativas anteriores está correta.

    Q-5: Qual o valor da expressão: 2 ** 3 ** 2

  • 512
  • Correto: como a associatividade de `**` é da direita para esquerda, o resultado é equivalente a 2 ** (3 ** 2)
  • 256
  • Incorreto: veja a associatividade de `**`
  • 128
  • Incorreto: veja a associatividade de `**`
  • 64
  • Incorreto: veja a associatividade de `**`
  • nenhuma das alternativas anteriores
  • Incorreto, ao menos uma das alternativas anteriores está correta.

    Q-6: Qual o valor da expressão: -2 ** 4

  • é igual a (-2) ** 4
  • Incorreto: verifique qual a precedência entre `**` e o `-` unário.
  • é igual a -(2 ** 4)
  • Correto: o operador `**` tem precedência.
  • 8
  • Incorreto: verifique qual a precedência entre `**` e o `-` unário.
  • 16
  • Incorreto: verifique qual a precedência entre `**` e o `-` unário.

Expressões relacionais

Além de “fazer contas”, o Python permite comparar valores usando os seguintes operadores relacionais:

Tabela dos operadores relacionais

Operador

Descrição

Exemplo

Resultado

==

igualdade

2 == 3

False

!=

desigualdade

2 != 3

True

>

maior

3 > 3

False

>=

maior ou igual

3 >= 3

True

<

menor

2 < 3

True

<=

menor ou igual

4 <= 3

False

Operadores relacionais comparam dois valores e o resultado pode ser False (falso) ou True (verdadeiro). Esse dois valores são chamados de valores booleanos em homenagem ao matemático George Boole (https://pt.wikipedia.org/wiki/George_Boole).

Assim como dizemos que as expressões aritméticas são reduzidas a um valor numérico inteiro ou real, as expressões relacionais são reduzidas a um valor booleano (ou seja, True ou False). As expressões relacionais podem conter expressões aritméticas, como no seguinte exemplo em Python shell:

>>> 2 + 3 == 3 + 2 * 1
True

Esse exemplo mostra que o resultado da expressão 2 + 3 == 3 + 2 * 1 é o valor booleano True. Isso porque a precedência dos operadores relacionais é menor que a dos operadores aritméticos, ou seja, as operações aritméticas são reduzidas primeiro, que resulta na comparação 5 == 5, e depois a expressão relacional é reduzida (no caso o operador ==), resultando em True.

Expressões lógicas

As expressões lógicas são construídas usando operadores lógicos sobre valores booleanos. A tabela a seguir mostra a precedência dos operadores lógicos usados em Python:

Precedência dos operadores lógicos

Operador

Descrição

Exemplo

Resultado

not

negação lógica

not True

False

and

E lógico

True and False

False

or

OR lógico

True or False

True

Expressões lógicas (ou booleanas) combinam valores booleanos com operadores lógicos.

O operador not troca o valor do operando, ou seja, troca o valor booleano de True para False e de False para True.

O operador and devolve True apenas quando seus dois operandos são True e devolve False caso contrário, quando ao menos um dos operandos é False, como mostra a tabela a seguir.

Tabela do operador lógico and

X and Y

X = True

X = False

Y = True

True

False

Y = False

False

False

Já o operador or devolve False apenas quando seus dois operandos são False e devolve True caso contrário (quando ao menos um dos operandos é True.

Tabela verdade do operador lógico or

X or Y

X = True

X = False

Y = True

True

True

Y = False

True

False

Como o resultado das comparações usando operadores relacionais é um booleano, os operadores lógicos podem ser utilizados para combinar os resultados relacionais. Por exemplo, considere x um valor real qualquer. A expressão x >= -1 and x <= 1 pode ser usado para testar se x pertence ao intervalo [-1, 1]. Assim, para x = 0 temos que a expressão é True pois as duas expressões relacionais se tornam verdadeiras. Mas quando x = 2, a comparação x <= 1 se torna falsa e portanto o resultado do operador and é False.

Para esse caso em particular o Python permite a notação a <= x <= b para verificar se o valor x está no intervalo [a, b]. Embora essa notação seja mais compacta e simples de entender, observe que, se cada operador relacional for reduzido um por vez, como (a <= x) <= b ou a <= (x <= b), os termos entre parênteses corresponderiam a valores booleanos que são incompatíveis com valores numéricos. Por exemplo, seja a=10, b=20, x=5 e a expressão (a <= x) <= b. Nesse caso, o valor entre parênteses seria False, resultado de (10 <= 5), e não teríamos como resolver False <= 20 dado que são valores de tipos incompatíveis para comparação.

Observe que o uso de incógnitas como a, b e x em expressões é muito útil. Em computação, elementos como esses são chamados de variáveis e são objeto do próximo capítulo.

Exercícios

  • Exercício 1:

    Escreva um expressão em função de uma incógnita nota que resulte em True caso nota esteja no intervalo aberto (3.0, 5.0), e resulte em False caso contrário.

    Dica

    A seguinte expressão em função de nota resulta em True para uma nota maior ou igual a 5

    nota >= 5
    
  • Exercício 2:

    Um ano bissexto ocorre aproximadamente a cada 4 anos. Escreva uma expressão (em função de uma incógnita ano) que resulte em True caso ano seja bissexto e False caso contrário. Para ser bissexto, o valor de ano precisa ser múltiplo de 4, exceto múltiplos de 100 que não são múltiplos de 400. Assim o ano de 2020 é bissexto pois satisfaz todas essas condições.

    Dica

    Use o operador % para verificar se ano é um múltiplo de algum número, como por exemplo

    ano % 4 == 0
    

    Se ano=12, a expressão 12 % 4 == 0 resulta em True pois como 12 é múltiplo de 4 o resto da divisão (12%4) é zero.

Para saber mais

Next Section - Variáveis, tipos e funções de entrada e saída