Saltar para o conteúdo
Topos Uranos

Resumo

Uma expressão aritmética não se calcula da esquerda para a direita como se lê, mas segundo uma estrutura oculta, sua árvore, que é fixada pela precedência dos operadores, por sua associatividade e pelos parênteses; e em cada nó dessa árvore o tipo dos operandos decide que operação se faz, de modo que 7 / 2 vale 3 e 7 / 2.0 vale 3.5. Esta aula estuda os cinco operadores aritméticos de C++ com inteiros e com reais; a divisão inteira e o resto, que desde C++11 truncam em direção a zero, do que se segue que o resto toma o sinal do dividendo e difere do resto da divisão euclidiana quando o dividendo é negativo; a maneira de obter o resto euclidiano; a árvore de uma expressão; o tipo do resultado quando os operandos são de tipos distintos, e as duas maneiras pelas quais uma expressão aritmética inteira perde seu significado: dividir por zero e estourar num cálculo intermediário.

Objetivos de aprendizagem

  1. Calcular o quociente e o resto da divisão inteira em C++, também com operandos negativos, e relacioná-los com o quociente e o resto da divisão euclidiana.
  2. Desenhar a árvore de uma expressão aritmética segundo a precedência e a associatividade, e calcular seu valor.
  3. Prever o tipo do resultado de uma operação entre operandos de tipos distintos.
  4. Usar a divisão inteira e o resto para decompor quantidades: os dígitos de um número, uma duração em horas e minutos, um dia da semana.

Os operadores aritméticos

C++ tem cinco operadores aritméticos binários: a soma +, a subtração -, o produto *, a divisão / e o resto %; tem, além disso, o menos unário, que troca o sinal de seu único operando, como em -x, e um mais unário, +x, que o deixa como está. Os quatro primeiros se aplicam a inteiros e a reais; o resto, só a inteiros. Ora, a mesma escrita não designa a mesma operação em todos os casos: se os dois operandos de / são inteiros, a divisão é inteira e seu resultado é um inteiro, o quociente sem a parte fracionária; se algum é real, a divisão é real. A aula Caracteres, booleanos, conversões e constantes mostrou a consequência mais visível desta regra, que double r{7 / 2}; guarda 3: a divisão foi feita entre inteiros antes que o resultado se convertesse em real.

ExemploOs cinco operadores com dois inteiros

O programa aplica os cinco operadores a 17 e 5, e repete a divisão com um dividendo real.

Programa em C++
#include <print>​int main(){    const int a{17};    const int b{5};    std::println("{} + {} = {}", a, b, a + b);    std::println("{} - {} = {}", a, b, a - b);    std::println("{} * {} = {}", a, b, a * b);    std::println("{} / {} = {}", a, b, a / b);    std::println("{} % {} = {}", a, b, a % b);    const double x{17.0};    std::println("{} / {} = {}", x, b, x / b);}
Saída
17 + 5 = 2217 - 5 = 1217 * 5 = 8517 / 5 = 317 % 5 = 217 / 5 = 3.4

17 dividido por 5 dá 3 e sobram 2: são o quociente e o resto de repartir 17 objetos em grupos de 5. A última linha divide um real por um inteiro e obtém 3.4. Convém notar que std::println escreve o real 17.0 como “17”: o marcador vazio escreve a representação mais curta do valor, de modo que o que se escreve não revela o tipo; para vê-lo, pedem-se casas decimais com {:.1f}.

O operador % não admite reais. Escrever 7.5 % 2 não é um erro de lógica que o programa descubra ao ser executado, mas um erro de compilação: o compilador diz que os operandos de tipos double e int não são válidos para o operador.

Programa em C++
#include <print>​int main(){    std::println("{}", 7.5 % 2);}
Mensagens de erro do compilador
main.cpp: In function ‘int main()’:main.cpp:5:28: error: invalid operands of types ‘double’ and ‘int’ to binary ‘operator%’    5 |     std::println("{}", 7.5 % 2);      |                        ~~~ ^ ~

O resto de uma divisão real existe, e quem o calcula é a função std::fmod do cabeçalho <cmath>, que será estudada na aula Bits e biblioteca matemática, junto com a potência: C++ não tem operador de potência, e 2 ^ 3 não vale 8, mas outra coisa que será explicada lá.