Introdução
Neste laboratório, você aprenderá como usar operadores em C++. Você aprenderá como usar operadores aritméticos, operadores relacionais, operadores lógicos e operadores bitwise (bitwise operators).
Neste laboratório, você aprenderá como usar operadores em C++. Você aprenderá como usar operadores aritméticos, operadores relacionais, operadores lógicos e operadores bitwise (bitwise operators).
Para dados numéricos e lógicos básicos, usamos operadores para operar com eles. Como outras linguagens, C++ oferece suporte completo para operadores. Comece a aprendê-los.
C++ suporta os seguintes operadores aritméticos para números:
| Operador | Descrição | Uso | Exemplos |
|---|---|---|---|
| * | Multiplicação | expr1 * expr2 | 2 3 → 6; 3.3 1.0 → 3.3 |
| / | Divisão | expr1 / expr2 | 1 / 2 → 0; 1.0 / 2.0 → 0.5 |
| % | Resto (Módulo) | expr1 % expr2 | 5 % 2 → 1; -5 % 2 → -1 |
| + | Adição | expr1 + expr2 | 1 + 2 → 3; 1.1 + 2.2 → 3.3 |
| - | Subtração | expr1 - expr2 | 1 - 2 → -1; 1.1 - 2.2 → -1.1 |
Todos os operadores acima são operadores binários, eles recebem dois operandos. A multiplicação, divisão e resto têm precedência sobre adição e subtração.
É importante notar que int/int produz um int, com o resultado truncado, 1/2 → 0 (não 0.5).
Se ambos os operandos de uma operação aritmética pertencerem ao mesmo tipo, a operação é realizada nesse tipo, e o resultado pertence a esse tipo. No entanto, se os dois operandos pertencerem a tipos diferentes, o compilador promove o valor do tipo menor para o tipo maior (conhecido como implicit type-casting). A operação é então realizada no tipo maior.
| Tipo | Exemplo | Operação |
|---|---|---|
| int | 2 + 3 | int 2 + int 3 → int 5 |
| double | 2.2 + 3.3 | double 2.2 + double 3.3 → double 5.5 |
| mix | 2 + 3.3 | int 2 + double 3.3 → double 2.0 + double 3.3 → double 5.3 |
| int | 1 / 2 | int 1 / int 2 → int 0 |
| double | 1.0 / 2.0 | double 1.0 / double 2.0 → double 0.5 |
| mix | 1 / 2.0 | int 1 / double 2.0 → double 1.0 + double 2.0 → double 0.5 |
Por exemplo
/* Testing mix-type arithmetic operations */
#include <iostream>
#include <iomanip> // needed for formatting floating-point numbers
using namespace std;
int main() {
int i1 = 2, i2 = 4;
double d1 = 2.5, d2 = 5.0;
// floating-points in fixed format with 1 decimal place
cout<<fixed<<setprecision(1);
cout << i1 << " + " << i2 << " = " << i1+i2 << endl; // 6
cout << d1 << " + " << d2 << " = " << d1+d2 << endl; // 7.5
cout << i1 << " + " << d2 << " = " << i1+d2 << endl; // 7.0 <==
cout << i1 << " - " << i2 << " = " << i1-i2 << endl; // -2
cout << d1 << " - " << d2 << " = " << d1-d2 << endl; // -2.5
cout << i1 << " - " << d2 << " = " << i1-d2 << endl; // -3.0 <==
cout << i1 << " * " << i2 << " = " << i1*i2 << endl; // 8
cout << d1 << " * " << d2 << " = " << d1*d2 << endl; // 12.5
cout << i1 << " * " << d2 << " = " << i1*d2 << endl; // 10.0 <==
cout << i1 << " / " << i2 << " = " << i1/i2 << endl; // 0 <==
cout << d1 << " / " << d2 << " = " << d1/d2 << endl; // 0.5
cout << i1 << " / " << d2 << " = " << i1/d2 << endl; // 0.4 <==
return 0;
}
Saída:
2 + 4 = 6
2.5 + 5.0 = 7.5
2 + 5.0 = 7.0
2 - 4 = -2
2.5 - 5.0 = -2.5
2 - 5.0 = -3.0
2 * 4 = 8
2.5 * 5.0 = 12.5
2 * 5.0 = 10.0
2 / 4 = 0
2.5 / 5.0 = 0.5

Overflow / Underflow
// Range of int is [-2147483648, 2147483647]
int i1 = 2147483647; // max int
cout << i1 + 1 << endl; // -2147483648 (overflow)
cout << i1 * i1 << endl; // 1
int i2 = -2147483648; // min int
cout << i2 - 1 << endl; // 2147483647 (underflow)
cout << i2 * i2 << endl; // 0
Em operações aritméticas, o valor resultante se repete (wraps around) se exceder seu intervalo. O tempo de execução do C++ não emite uma mensagem de erro/aviso, mas produz um resultado incorreto. É importante notar que a verificação de overflow/underflow é responsabilidade do programador.
C++ também fornece os chamados operadores de atribuição composta, conforme listados:
| Operador | Uso | Descrição | Exemplo |
|---|---|---|---|
| = | var = expr | Atribui o valor do lado esquerdo (LHS) à variável no lado direito (RHS) | x = 5; |
| += | var += expr | o mesmo que var = var + expr | x += 5; o mesmo que x = x + 5 |
| -= | var -= expr | o mesmo que var = var - expr | x -= 5; o mesmo que x = x - 5 |
| *= | var *= *expr* | o mesmo que var = var * expr | x = 5; o mesmo que x = x 5 |
| /= | var /= expr | o mesmo que var = var / expr | x /= 5; o mesmo que x = x / 5 |
| %= | var %= expr | o mesmo que var = var % expr | x %= 5; o mesmo que x = x % 5 |
| ++ | ++x | Pré-Incremento | y=++x; o mesmo que x=x+1; y=x |
| ++ | x++ | Pós-Incremento | y=x++; o mesmo que oldX=x; x=x+1; y=oldX |
| -- | --x | Pré-Decremento | y=--x; o mesmo que x=x-1; y=x |
| -- | x-- | Pós-Decremento | y=x--; o mesmo que oldX=x; x=x-1; y=oldX |
x = 5;
cout << x++ << endl; // Save x (5); Increment x (=6); Print old x (5).
x = 5;
cout << ++x << endl; // Increment x (=6); Print x (6).
Quando você atribui um valor de um tipo fundamental (embutido) a uma variável de outro tipo fundamental, C++ converte automaticamente o valor para o tipo receptor, se os dois tipos forem compatíveis. Por exemplo,
int a uma variável double, o compilador automaticamente converte o valor int para um double (por exemplo, de 1 para 1.0) e o atribui à variável double.double a uma variável int, o compilador automaticamente converte o valor double para um valor int (por exemplo, de 1.2 para 1) e o atribui à variável int. A parte fracionária seria truncada e perdida. Alguns compiladores emitem um aviso/erro "possível perda de precisão"; outros não. int i;
double d;
i = 3;
d = i; // Assign an int value to double
cout << "d = " << d << endl; // 3.0
d = 5.5;
i = d; // Assign a double value to int
cout << "i = " << i << endl; // 5 (truncated, no warning!)
Você pode realizar explicitamente o type-casting por meio do chamado operador de type-casting unário na forma de (new-type) operand ou new-type (operand). O operador de type-casting recebe um operando no tipo específico e retorna um valor equivalente no novo tipo. Observe que é uma operação que produz um valor resultante, semelhante a uma operação de adição, embora a adição envolva dois operandos. Por exemplo,
cout << (double)5 << endl; // int 5 → double 5.0
cout << (int)5.5 << endl; // double 5.5 → int 5
double aDouble = 5.6;
int anInt = (int)aDouble; // return 5 and assign to anInt. aDouble does not change!
// C++ also supports function-style type cast.
cout << double(5) << endl; // 5.0
cout << int(5.5) << endl; // 5
cout << int(aDouble) << endl; // 5
Muitas vezes, você precisa comparar dois valores antes de decidir a ação a ser tomada. C++ fornece seis operadores de comparação (ou operadores relacionais):
| Operador | Descrição | Uso | Exemplo (x=5, y=8) |
|---|---|---|---|
| == | Igual a | expr1 == expr2 | (x == y) → false |
| != | Diferente de | expr1 != expr2 | (x != y) → true |
| > | Maior que | expr1 > expr2 | (x > y) → false |
| >= | Maior que ou igual a | expr1 >= expr2 | (x >= 5) → true |
| < | Menor que | expr1 < expr2 | (y < 8) → false |
| <= | Menor que ou igual a | expr1 >= expr2 | (y <= 8) → true |
| && | AND lógico | expr1 && expr2 | -------- |
| || | OR lógico | expr1 || expr2 | -------- |
| ! | NOT lógico | !expr | -------- |
| ^ | XOR lógico | expr1 ^ expr2 | -------- |
As tabelas-verdade são as seguintes:
| AND (&&) | true | false |
|---|---|---|
| true | true | false |
| false | false | false |
| OR (||) | true | false |
|---|---|---|
| true | true | true |
| false | true | false |
| NOT (!) | true | false |
|---|---|---|
| false | true |
| XOR (^) | true | false |
|---|---|---|
| true | false | true |
| false | true | false |
// Return true if x is between 0 and 100 (inclusive)
(x >= 0) && (x <= 100)
// wrong to use 0 <= x <= 100
// Return true if x is outside 0 and 100 (inclusive)
(x < 0) || (x > 100) //or
!((x >= 0) && (x <= 100))
// Return true if year is a leap year
// A year is a leap year if it is divisible by 4 but not by 100, or it is divisible by 400.
((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)
Esta parte é relativamente fácil, você deve relacioná-la com a seção anterior. Não há necessidade de memorizá-los, mas sim de entender sua lógica.