Operadores em linguagem Rust

Operadores em linguagem Rust

Em programação, um operador é um símbolo define uma função que será realizada sobre os dados em uma aplicação. Os dados sobre os quais esses operadores atuam são chamados de operandos.

Consideremos a seguinte expressão:

9 + 10 = 19

Aqui, os valores 9 e 10 são os operandos, enquanto os sinais + e = são os operadores. Já o valor 19 é o resultado da operação realizada – no caso, uma operação aritmética de soma de dois números inteiros.

A linguagem Rust possui suporte a diversos tipos de operadores, e os principais operadores primários podem ser classificados como:

  • Aritméticos
  • Bitwise (Operadores bit-a-bit)
  • Relacionais ou de Comparação
  • Lógicos

Vejamos quais são esses operadores, suas funções e exemplos de uso de cada um deles.

Operadores Aritméticos

Os operadores aritméticos são empregados na realização de cálculos aritméticos simples, usando as quatro operações básicas da matemática mais a operação como o módulo.

A tabela a seguir mostra os operadores aritméticos com sua descrição, e um exemplo de uso de cada. Nos exemplos, vamos imaginar que os valores em duas variáveis a e b são 10 e 5, respectivamente.

Operador Descrição Exemplo
+ Retorna a soma dos operandos a + b é 15
Retorna a diferença dos valores a – b é 5
* Retorna o produto dos valores a * b é 50
/ Realiza a divisão e retorna o quociente a / b é 2
% Realiza a divisão e retorna o restante a % b é 0

Nota: Os operadores de incremento e decremento ++ e -- não são suportados em Rust. Vejamos agora exemplos de código que usam esses operadores.

Exemplo de uso de operadores aritméticos

fn main() {
  let a = 10;
  let b = 5;
  println!("Soma: {}", a + b); // Soma
  println!("Subtração: {}", a - b); // Subtração
  println!("Multiplicação: {}", a * b); // Multiplicação
  println!("Divisão: {}", a / b); // Divisão
  println!("Módulo: {}", a % b); // Resto da divisão inteira
}

Saída:

Soma: 15
Subtração: 5
Multiplicação: 50
Divisão: 2
Módulo: 0

Operadores Relacionais

Os operadores relacionais testam ou definem o tipo de relação entre duas entidades. São usados para comparar dois ou mais valores, sendo também conhecidos como operadores de comparação, e retornam sempre um valor booleano (true ou false).

A tabela a seguir mostra os operadores relacionais com sua descrição, e um exemplo de uso de cada. Vamos assumir os valores de variáveis A = 10 e B = 20 nos exemplos.

Operador Descrição Exemplo
> Maior que (A > B) é False
< Menor que (A < B) é True
>= Maior ou igual a (A >= B) é False
<= Menor ou igual a (A <= B) é True
== Igual a (A == B) é False
!= Diferente de (A != B) é True

Vejamos agora exemplos de código que usam os operadores de comparação / relacionais.

Exemplo de uso de operadores relacionais

fn main() {
  let a = 10;
  let b = 20;
  println!("a vale {a} e b vale {b}");
  println!("{a} é maior que {b}? {}", a > b);
  println!("{a} é menor que {b} ? {}", a < b);
  println!("{a} é maior ou igual a {b} ? {}", a >= b);
  println!("{a} é menor ou igual a {b} ? {}", a <= b);
  println!("{a} é igual a {b} ? {}", a == b);
  println!("{a} é diferente de {b} ? {}", a != b);
}

Saída:

a vale 10 e b vale 20
a é maior que b? false
a é menor que b? true
a é maior ou igual a b? false
a é menor ou igual a b? true
a é igual a ? false
a é diferente de b? true

Operadores Lógicos

Os operadores lógicos são usados para combinar duas ou mais condições e retornam um valor booleano, que é True (verdadeiro) ou False (falso). Vamos assumir novamente os valores A = 10 e B = 20.

Operador Descrição Exemplo
&& Retorna true se todas as condições forem verdadeiras; se uma das condições for falsa, retorna false. (A > 10 && B > 10) é False
|| Retorna true se pelo menos uma das condições for true;somente retorna false se todas as condições forem falsas. (A > 10 || B > 10) é True
! Operador unário inversor (age sobre um único operando). Retorna o inverso do valor lógico do operando (que pode ser uma expressão): se o valor for True, retorna False, e se for False, retorna True. !(A > 10) é True

Exemplo de uso de operadores lógicos

fn main() {
  let a = 10;
  let b = 20;
  println!("a vale {a} e b vale {b}");
  println!("AND lógico: {}", a > 5 && b > 15); // True se ambas as condições forem verdadeiras
  println!("OR lógico: {}", a > 15 || b > 15); // True se ao menos uma condição for verdadeira
  println!("NOT lógico: {}", !(a > 15)); // Inverte o resultado
}

Saída:

a vale 10 e b vale 20
AND lógico: true
OR lógico: true
NOT lógico: true

Operadores Bitwise e de Deslocamento de Bits

Os operadores de bit-a-bit ou bitwise realizam operações diretamente sobre os bits de dois ou mais números. Em vez de trabalhar com valores booleanos (verdadeiro / falso), eles trabalham a nível de bit, o que significa que cada bit de um número é comparado ao bit correspondente do outro número.

Esses operadores são muito usados em programação para manipular valores binários, criar máscaras de bits, realizar otimizações em algoritmos e resolver problemas relacionados à lógica binária.

Já os os operadores de deslocamento de bits (<< e >>), ou operadores bitwise shift são usados para mover os bits de um número inteiro para a esquerda ou para a direita. São úteis em muitas situações, como manipulação de dados de baixo nível, otimizações em cálculos e implementação de algoritmos matemáticos.

Sejam as variáveis A = 2 e B = 3:

Operador Descrição Exemplo
& AND bit a bit. Somente retorna 1 se todas os bits de entrada dos operandos forem iguais a 1. A & B = 2
| OR bit a bit. Somente retorna 0 se todos os bits de operandos forem iguais a 0. (A | B) é 3
^ XOR bit a bit. Retorna 0 se os bits de entrada forem iguais, e retorna 1 se forem diferentes. (A ^ B) é 1
~ NOT bit a bit. Inverte a condição de entrada: 0 se torna 1, e 1 se torna 0. Trata-se de um operador unário inversor. (~B) é -4
<< Deslocamento à esquerda. Move os bits de um número para a esquerda por um número especificado de posições.
A cada posição que os bits são movidos, o valor do número é multiplicado por 2.
(A << 1) é 4
>> Deslocamento à direita. Move os bits de um número para a direita por um número especificado de posições.
A cada posição que os bits são movidos, o valor do número é dividido por 2, desprezando o resto.
(A >> 1) é 1

O operador de deslocamento à esquerda (<<), na prática, multiplica o número por 2 a cada deslocamento. Já o operador de deslocamento à direita (>>) divide o número por 2 a cada deslocamento, descartando a parte fracionária.

Exemplo de uso de operadores bit a bit

fn main() {
  let a: u8 = 2; // 0000_0010 em binário
  let b: u8 = 3; // 0000_0011 em binário
  println!("a vale {a} e b vale {b}");
  println!("AND bitwise: {}", a & b); // 0000_0010
  println!("OR bitwise: {}", a | b); // 0000_0011
  println!("XOR bitwise: {}", a ^ b); // 0000_0001
  println!("NOT bitwise: {}", !b); // Inversão de todos os bits
  println!("Shift à esquerda: {}", a << 1); // Desloca os bits para a esquerda
  println!("Shift à direita: {}", a >> 1); // Desloca os bits para a direita
}

Saída:

a vale 2 e b vale 3
AND bitwise: 2
OR bitwise: 3
XOR bitwise: 1
NOT bitwise: 252
Shift à esquerda: 4
Shift à direita: 1

Conclusão

Neste artigo vimos quais são os principais operadores utilizados em linguagem Rust, sua importância e utilidade, e alguns exemplos de uso de cada um deles. Nos próximos tutoriais vamos usar esses operadores para criar programas mais complexos, usando outras estruturas de programação como laços de repetição, decisão condicional e arrays, entre outras.

Sobre Fábio dos Reis (1226 Artigos)
Fábio dos Reis trabalha com tecnologias variadas há mais de 30 anos, tendo atuado nos campos de Eletrônica, Telecomunicações, Programação de Computadores e Redes de Dados. É um entusiasta de Ciência e Tecnologia em geral, adora Viagens e Música, e estuda idiomas, além de ministrar cursos e palestras sobre diversas tecnologias em São Paulo e outras cidades do Brasil.

Escreva um comentário

Seu e-mail não será divulgado


*