Introducción
En este laboratorio, aprenderá a usar operadores en C++. Aprenderá a usar operadores aritméticos, operadores relacionales, operadores lógicos y operadores bit a bit.
💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí
En este laboratorio, aprenderá a usar operadores en C++. Aprenderá a usar operadores aritméticos, operadores relacionales, operadores lógicos y operadores bit a bit.
Para datos numéricos y lógicos básicos, usamos operadores para operar con ellos. Al igual que otros lenguajes, C++ ofrece un amplio soporte para los operadores. Comencemos a aprenderlos.
C++ admite los siguientes operadores aritméticos para números:
Operador | Descripción | Uso | Ejemplos |
---|---|---|---|
* | Multiplicación | expr1 * expr2 | 2 _ 3 → 6; 3.3 _ 1.0 → 3.3 |
/ | División | expr1 / expr2 | 1 / 2 → 0; 1.0 / 2.0 → 0.5 |
% | Resto (Módulo) | expr1 % expr2 | 5 % 2 → 1; -5 % 2 → -1 |
+ | Suma | expr1 + expr2 | 1 + 2 → 3; 1.1 + 2.2 → 3.3 |
- | Resta | expr1 - expr2 | 1 - 2 → -1; 1.1 - 2.2 → -1.1 |
Todos los operadores anteriores son operadores binarios, toman dos operandos. La multiplicación, la división y el resto tienen precedencia sobre la suma y la resta.
Es importante tener en cuenta que int/int
produce un int
, con el resultado truncado, 1/2 → 0 (no 0.5
).
Si ambos operandos de una operación aritmética pertenecen al mismo tipo, la operación se realiza en ese tipo y el resultado pertenece a ese tipo. Sin embargo, si los dos operandos pertenecen a tipos diferentes, el compilador promueve el valor del tipo más pequeño al tipo más grande (conocido como conversión implícita de tipos). Luego, la operación se realiza en el tipo más grande.
Tipo | Ejemplo | Operación |
---|---|---|
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 ejemplo
/* Probando operaciones aritméticas de tipos mixtos */
#include <iostream>
#include <iomanip> // necesario para formatear números de punto flotante
using namespace std;
int main() {
int i1 = 2, i2 = 4;
double d1 = 2.5, d2 = 5.0;
// números de punto flotante en formato fijo con 1 decimal
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;
}
Salida:
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
Desbordamiento / Subdesbordamiento
// Rango de int es [-2147483648, 2147483647]
int i1 = 2147483647; // int máximo
cout << i1 + 1 << endl; // -2147483648 (desbordamiento)
cout << i1 * i1 << endl; // 1
int i2 = -2147483648; // int mínimo
cout << i2 - 1 << endl; // 2147483647 (subdesbordamiento)
cout << i2 * i2 << endl; // 0
En las operaciones aritméticas, el valor resultante se desborda si excede su rango. El tiempo de ejecución de C++ no emite un mensaje de error/advertencia, sino que produce un resultado incorrecto. Es importante tener en cuenta que la verificación de desbordamiento/subdesbordamiento es responsabilidad del programador.
C++ también proporciona los llamados operadores de asignación compuesta enumerados a continuación:
Operador | Uso | Descripción | Ejemplo |
---|---|---|---|
= | var = expr | Asigna el valor del lado izquierdo a la variable del lado derecho | x = 5; |
+= | var += expr | Lo mismo que var = var + expr | x += 5; lo mismo que x = x + 5 |
-= | var -= expr | Lo mismo que var = var - expr | x -= 5; lo mismo que x = x - 5 |
*= | var *= *expr* | Lo mismo que var = var * expr | x _= 5; lo mismo que x = x _ 5 |
/= | var /= expr | Lo mismo que var = var / expr | x /= 5; lo mismo que x = x / 5 |
%= | var %= expr | Lo mismo que var = var % expr | x %= 5; lo mismo que x = x % 5 |
++ | ++x | Incremento previo | y=++x; lo mismo que x=x+1;y=x |
++ | x++ | Incremento posterior | y=x++; lo mismo que oldX=x; x=x+1; y=oldX |
-- | --x | Decremento previo | y=--x; lo mismo que x=x-1;y=x |
-- | x-- | Decremento posterior | y=x--; lo mismo que oldX=x; x=x-1; y=oldX |
x = 5;
cout << x++ << endl; // Guarda x (5); Incrementa x (=6); Imprime el antiguo x (5).
x = 5;
cout << ++x << endl; // Incrementa x (=6); Imprime x (6).
Cuando asignas un valor de un tipo fundamental (integrado) a una variable de otro tipo fundamental, C++ convierte automáticamente el valor al tipo receptor, si los dos tipos son compatibles. Por ejemplo:
int
a una variable de double
, el compilador convierte automáticamente el valor de int
a double
(por ejemplo, de 1 a 1.0) y lo asigna a la variable de double
.double
a una variable de int
, el compilador convierte automáticamente el valor de double
a un valor de int
(por ejemplo, de 1.2 a 1) y lo asigna a la variable de int
. La parte fraccionaria se truncará y se perderá. Algunos compiladores emiten una advertencia/error "posible pérdida de precisión"; otros no. int i;
double d;
i = 3;
d = i; // Asigna un valor de int a double
cout << "d = " << d << endl; // 3.0
d = 5.5;
i = d; // Asigna un valor de double a int
cout << "i = " << i << endl; // 5 (truncado, ¡sin advertencia!)
Puedes realizar una conversión de tipo explícitamente a través del llamado operador de conversión de tipo unario en la forma (nuevo-tipo) operando
o nuevo-tipo (operando)
. El operador de conversión de tipo toma un operando en el tipo particular y devuelve un valor equivalente en el nuevo tipo. Tenga en cuenta que es una operación que produce un valor resultante, similar a una operación de suma aunque la suma implica dos operandos. Por ejemplo:
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; // devuelve 5 y lo asigna a anInt. aDouble no cambia!
// C++ también admite la conversión de tipo de estilo de función.
cout << double(5) << endl; // 5.0
cout << int(5.5) << endl; // 5
cout << int(aDouble) << endl; // 5
Muy a menudo, necesitas comparar dos valores antes de decidir qué acción tomar. C++ proporciona seis operadores de comparación (o operadores relacionales):
Operador | Descripción | Uso | Ejemplo (x=5, y=8) |
---|---|---|---|
== | Igual a | expr1 == expr2 | (x == y) → false |
!= | Diferente de | expr1!= expr2 | (x!= y) → true |
> | Mayor que | expr1 > expr2 | (x > y) → false |
>= | Mayor que o igual a | expr1 >= expr2 | (x >= 5) → true |
< | Menor que | expr1 < expr2 | (y < 8) → false |
<= | Menor que o 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 | -------- |
Las tablas de verdad son las siguientes:
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 |
// Devuelve true si x está entre 0 y 100 (inclusive)
(x >= 0) && (x <= 100)
// está mal usar 0 <= x <= 100
// Devuelve true si x está fuera de 0 y 100 (inclusive)
(x < 0) || (x > 100) //o
!((x >= 0) && (x <= 100))
// Devuelve true si year es un año bisiesto
// Un año es bisiesto si es divisible por 4 pero no por 100, o si es divisible por 400.
((year % 4 == 0) && (year % 100!= 0)) || (year % 400 == 0)
Esta parte es relativamente fácil. Deberías relacionarlas con la sección anterior. No es necesario memorizarlas, solo entender su lógica mentalmente.