Literal: são dados constantes escritos diretamente no código, cujo valor é visível à primeira vista, sendo a forma mais básica de representação de dados em um programa.
Seu valor é fixo e imutável, gravado diretamente no código e não pode ser alterado durante a execução. Não requer cálculos nem interpretação de variáveis; literalmente significa “valor escrito literalmente”.
Exemplo: os números 13 e 3.14 abaixo são literais, também chamados de valores literais em outras linguagens.
fn main() {
println!("{}", 13);
println!("{}", 3.14);
}Code language: JavaScript (javascript)
Para facilitar o aprendizado, a equipe oficial disponibiliza um editor Rust online. Não é preciso instalar um ambiente local para praticar a sintaxe básica do Rust, clique no link abaixo
Literais
O Rust suporta literais dos tipos: inteiro, ponto flutuante, caractere, string, booleano, unidade (unit).
- Inteiro:
11 - Caractere:
'a'(aspas simples) - String:
"abc"(aspas duplas) - Booleano:
true/false - Tipo unidade:
()
Diversas bases para inteiros
As bases são diferenciadas por um prefixo, válido apenas para inteiros:
- Hexadecimal: começa com
0x, ex:0x1F - Octal: começa com
0o, ex:0o77 - Binário: começa com
0b, ex:0b1010
Separador numérico
Dentro dos literais numéricos é possível inserir um underline _ para melhorar a legibilidade, não altera o valor real do número:
- Inteiro:
1_000=1000 - Ponto flutuante:
0.000_001=0.000001
Notação científica
Números de ponto flutuante aceitam a notação científica com E, o tipo padrão é f64:
1e6= 10000007.6e-4= 0,00076
Sufixos de tipo dos literais (fundamental)
No Rust é obrigatório declarar o tipo do literal, os sufixos mais utilizados são:
u32: inteiro sem sinal de 32 bits (apenas valores não negativos)i32: inteiro com sinal de 32 bits (aceita números positivos e negativos)
Aviso: não é possível misturar operações com inteiros com e sem sinal, isso causará erro imediatamente.
Exemplo de código:
fn main() {
// 1. Literal de inteiro comum
println!("Inteiro: {}", 13);
// Inteiros binário, octal, hexadecimal
println!("Binário: {}", 0b1010);
println!("Octal: {}", 0o77);
println!("Hexadecimal: {}", 0x2A);
// Inteiro com separador (melhora legibilidade)
println!("Inteiro com underline: {}", 1_000_000);
// Inteiro com sufixo de tipo
println!("Inteiro u32 sem sinal: {}", 100u32);
println!("Inteiro i32 com sinal: {}", -50i32);
// 2. Literal de ponto flutuante
println!("Ponto flutuante: {}", 3.14);
// Ponto flutuante com underline
println!("Ponto flutuante com underline: {}", 0.000_001);
// Ponto flutuante em notação científica
println!("Notação científica: {}", 1e6);
println!("Notação científica negativa: {}", 7.6e-4);
// 3. Literal de string (aspas duplas)
println!("String: {}", "hello world");
// 4. Literal de caractere (aspas simples, apenas um caractere)
println!("Caractere: {}", 'a');
println!("Caractere chinês: {}", '中');
// 5. Literal booleano
println!("Booleano true: {}", true);
println!("Booleano false: {}", false);
// 6. Literal de unidade () (tipo unidade do Rust)
println!("Tipo unidade: {:?}", ());
}Code language: JavaScript (javascript)
Operadores
As regras e precedência dos operadores do Rust são semelhantes às linguagens da família C.
1. Operadores aritméticos
Operações básicas como soma e subtração, usados com sufixos de tipo de inteiros:
- Soma:
+ - Subtração:
-
2. Operadores lógicos booleanos (curto-circuito)
Só funcionam com valores booleanos true/false:
- E lógico
&&: resultado true apenas se ambos os lados forem true - Ou lógico
||: resultado true se pelo menos um dos lados for true - Não lógico
!: inverte o valor booleano
| Expressão | Resultado da operação |
|---|---|
| true && true | true |
| true && false | false |
| false && true | false |
| false && false | false |
| true || true | true |
| true || false | true |
| false || true | true |
| false || false | false |
| !true | false |
| !false | true |
3. Operadores bit a bit (manipulação de bits binários)
Usados principalmente em inteiros, o exemplo utiliza {:04b} para imprimir um número binário de 4 dígitos formatado:
- E bit a bit
&: bit resultante é 1 apenas se os dois bits da mesma posição forem 1 - Ou bit a bit
|: bit resultante é 1 se pelo menos um bit da mesma posição for 1 - Ou exclusivo bit a bit
^: bit resultante é 1 se os bits da mesma posição forem diferentes, senão 0 - Deslocamento à esquerda
<<: move todos os bits binários para a esquerda (equivalente a ×2ⁿ) - Deslocamento à direita
>>: move todos os bits binários para a direita (equivalente a ÷2ⁿ)
0 0 1 1
& 0 1 0 1
-----------
0 0 0 1
0 0 1 1
| 0 1 0 1
-----------
0 1 1 1
0 0 1 1
^ 0 1 0 1
-----------
0 1 1 0
Deslocamento à esquerda <<
Binário: 00000001
Deslocar 5 bits → 00100000, resultado = 32
Deslocamento à direita >>
0x80 binário: 10000000
Deslocar 2 bits → 00100000 (hexadecimal 0x20), resultado = 32
fn main() {
// ========== Operadores aritméticos ==========
// Soma de inteiro: u32 inteiro sem sinal de 32 bits
// Resultado: 1 + 2 = 3
println!("1 + 2 = {}", 1u32 + 2);
// Subtração de inteiro: i32 inteiro com sinal de 32 bits, aceita negativos
// Se trocar para 1u32 ocorre erro, inteiro sem sinal não representa números negativos
// Resultado: 1 - 2 = -1
println!("1 - 2 = {}", 1i32 - 2);
// ========== Literais de ponto flutuante - notação científica ==========
// Resultado: 1e4 vale 10000, -2.5e-3 vale -0,0025
println!("1e4 vale {}, -2.5e-3 vale {}", 1e4, -2.5e-3);
// ========== Operadores lógicos booleanos (curto-circuito) ==========
// E lógico &&: resultado true apenas se os dois lados forem true
// Resultado: true E false = false
println!("true E false = {}", true && false);
// Ou lógico ||: resultado true se um dos lados for true
// Resultado: true Ou false = true
println!("true Ou false = {}", true || false);
// Não lógico !: inverte valor booleano
// Resultado: Não true = false
println!("Não true = {}", !true);
// ========== Operadores bit a bit (manipulação de bits binários) ==========
// {:04b} imprime sempre 4 dígitos binários, preenchendo com 0 à esquerda se faltar dígitos
// E bit a bit &: bit resultado é 1 só se ambos os bits correspondentes forem 1
// Resultado: 0011 E bit a bit 0101 = 0001
println!("0011 E bit a bit 0101 = {:04b}", 0b0011u32 & 0b0101);
// Ou bit a bit |: bit resultado é 1 se qualquer bit correspondente for 1
// Resultado: 0011 Ou bit a bit 0101 = 0111
println!("0011 Ou bit a bit 0101 = {:04b}", 0b0011u32 | 0b0101);
// Ou exclusivo bit a bit ^: bit resultado é 1 se bits correspondentes forem diferentes
// Resultado: 0011 Ou exclusivo bit a bit 0101 = 0110
println!("0011 Ou exclusivo bit a bit 0101 = {:04b}", 0b0011u32 ^ 0b0101);
// Deslocamento à esquerda <<: mover todos os bits 5 posições para a esquerda
// Resultado: 1 deslocado 5 bits à esquerda = 32
println!("1 deslocado 5 bits à esquerda = {}", 1u32 << 5);
// Deslocamento à direita >>: mover todos os bits 2 posições para a direita, {:x} exibe hexadecimal
// Resultado: 0x80 deslocado 2 bits à direita = 0x20
println!("0x80 deslocado 2 bits à direita = 0x{:x}", 0x80u32 >> 2);
// ========== Separador numérico _ ==========
// O underline só melhora legibilidade, não altera o valor do número
// Resultado: Um milhão se escreve: 1000000
println!("Um milhão se escreve: {}", 1_000_000u32);
}Code language: JavaScript (javascript)
III. Observações complementares sobre execução do código
- Substituir
1i32por1u32e executar a subtração1u32 - 2gera erro: inteiros sem sinal não conseguem representar valores negativos. {:04b}: sintaxe de formatação,bsignifica binário,04completa com zeros à esquerda se houver menos de 4 dígitos.- Para números grandes recomenda-se usar underline como separador (ex:
1_000_000u32), deixa o código mais fácil de ler.