Operador % em C++ – como calcular resto de divisão

operador % em C++

Para calcular o resto de uma divisão em C++, basta usar o operador % – também conhecido como operador módulo. O operador % retorna o resto da divisão entre dois inteiros. Veja no exemplo abaixo como usar o operador módulo em C++.


Exemplo 1 – operador % em C++ para obter o resto de uma divisão

#include <iostream>

int main() {

    int x = 10;
    int y = 3;
    
    std::cout << "O resto da divisao de x por y eh: " << x % y << std::endl;

    return 0;
}

O resto da divisao de x por y eh: 1


O operador % só funciona se os operandos forem valores de tipo inteiro.

Usar o operador % para percorrer um array

Há também um outro uso do operador % que deriva do primeiro e é bastante útil para se percorrer arrays criados à moda antiga usando new (veja meu artigo sobre porquê não criar arrays dessa maneira – ao invés deles use vector) ou um array no estilo C. Para explicar esse uso do operador %, irei usar um exemplo.

Suponha que você tenha um array de inteiros com 5 elementos, e que você tenha uma variável usada para acessar um elemento desse vetor. A pegadinha aqui é que esta variável pode ter, em princípio, qualquer valor de 0 até infinito (obviamente ela não será infinita, mas espero que você tenha entendido a idéia). Como você pode fazer para garantir que no seu programa apenas os índices de 0 a 4 (que são os índices do seu array) serão acessados, se a variável pode ter qualquer valor? Veja esse exemplo de problema no código abaixo.

#include <iostream>

int main() {

    int a[5] {1, 2, 3, 4, 5};
    int idx {0};
    
    std::cout << "Digite o indice do valor que voce deseja acessar no array: ";
    std::cin >> idx;
    
    std::cout << "O valor pedido eh " << a[idx] << std::endl;

    return 0;
}

No exemplo acima basta que o usuário digite um número maior que 4 para que o programa acesse uma região de memória que não pertence mais ao array, e seu comportamento será imprevisível. Como você poderia garantir, então, que o índice acessado no array estará sempre entre 0 e 4, não importando quão grande seja o valor fornecido pelo usuário? Aí está o truque do operador %.

O uso do operador % sobre o valor de idx, fornecendo-lhe como denominador o número 5 (que é o tamanho do array), garantirá que sempre que um número maior que 4 seja fornecido, o valor será “resetado” para 0. Deixe me explicar de outra forma. Na verdade, o uso do operador % nesse caso garante os múltiplos inteiros de 5 sejam “removidos” do valor original fornecido pelo usuário, sobrando só uma parte que é menor do que 5.

Considere que o usuário digitou o valor 83. O trabalho do operador % é o de “remover” 80 do valor 83, restando-lhe apenas o valor 3. Assim, o número do índice 3 do array será acessado. Muito doido, não? Veja abaixo como isso funciona na prática.

#include <iostream>

int main() {
    static constexpr int arraySize {5};
    int a[arraySize] {1, 2, 3, 4, 5};
    int idx {0};
    
    std::cout << "Digite o indice do valor que voce deseja acessar no array: ";
    std::cin >> idx;
    
    std::cout << "O valor pedido eh " << a[idx % arraySize] << std::endl;

    return 0;
}

Conclusão

Vimos neste artigo como o operador % em C++ pode ser usado para obter-se o resto de uma divisão, e como esta capacidade nos permite criar um “truque” para garantir que índices fora dos limites de um array nunca serão acessados no nosso programa – e tudo isso em menos de 10 minutos!

Gostou do artigo? Então inscreva-se na nossa newsletter para não perder nenhum dos nossos artigos 🙂

Foto de perfil de Emanoel

Sou apaixonado por tecnologia, literatura e também filosofia. O cultivo dessas paixões ao longo da minha trajetória me inspiraram a compartilhar aquilo que aprendo com os outros da maneira mais clara que eu possa. Sou formado em Engenharia Elétrica no Brasil, e também sou engenheiro formado na França. Trabalho atualmente como programador C++ em uma multinacional francesa, uma das maiores empresas de TI do mundo.

Leave a Reply

Your email address will not be published. Required fields are marked *