Espacios de nombres
Variantes
Acciones

Expresiones

De cppreference.com
< cpp‎ | language

Un expresión es una secuencia de operadores y sus operandos, que especifican un cálculo.

La evaluación de expresiones puede producir un resultado (por ejemplo, la evaluación de 2+2 produce el resultado 4) y puede generar otros efectos (por ejemplo, la evaluación de std::printf("%d",4) imprime en la salida estándar el carácter '4').

Contenido

[editar] General

  • las categorías de valores (lvalue, rvalue, glvalue, prvalue, xvalue) clasifican las expresiones según sus valores.
  • el orden de evaluación de los argumentos y subexpresiones especifican el orden que se obtienen los resultados intermedios.

[editar] Operadores

Operadores comunes
asignación incremento/decremento aritmético lógico comparación acceso a miembro otros

a = b
a = rvalue
a += b
a -= b
a *= b
a /= b
a %= b
a &= b
a |= b
a ^= b
a <<= b
a >>= b

++a
--a
a++
a--

+a
-a
a + b
a - b
a * b
a / b
a % b
~a
a & b
a | b
a ^ b
a << b
a >> b

!a
a && b
a || b

a == b
a != b
a < b
a > b
a <= b
a >= b

a[b]
*a
&a
a->b
a.b
a->*b
a.*b

a(...)
a, b
(type) a
? :

Operadores especiales

static_cast convierte de un tipo a otro tipo compatible
dynamic_cast convierte de clase base virtual a clase derivada
const_cast convierte de un tipo a otro compatible con diferentes calificadores constante/volátil
reinterpret_cast convierte el tipo a tipo incompatible
new asigna memoria
delete desasigna memoria
sizeof consulta el tamaño de un tipo
sizeof... consulta el tamaño de un parámetro de paquete (desde C++11)
typeid consulta la información de un tipo
noexcept comprueba si una expresión puede lanzar una excepción (desde C++11)
alignof consultas requisitos de alineación de un tipo (desde C++11)

[editar] Conversiones

[editar] Asiganción de memoria

[editar] Otros

[editar] Expresiones primarias

Los operandos de cualquier operador puede ser otra expresión o expresión primaria (por ejemplo, en 1+2*3, los operandos del operador + son la subexpresión 2*3 y la expresión primaria 1).

Las expresiones primarias son una de las siguientes:

1) Literales (por ejemplo, 2 o "Hola, mundo")
2) Identificadores sin calificar adecuadamente declarados (por ejemplo, n o cout)
3) Identificadores calificados adecuadamente declarados (por ejemplo, std::string::npos)
5) Expresiones Fold (C++17)

También se clasifica como expresión primaria cualquier expresión entre paréntesis: esto garantiza que los paréntesis tienen mayor precedencia que cualquier operador. Los paréntesis preservan el valor, tipo, y la categoría de valor.

[editar] Literales

Los literales son elementos de un programa C++ que representan valores contantes embebidos en el código fuente.

[editar] Expresiones no evaluadas

Los operandos de los operadores typeid, sizeof, noexcept, y decltype (desde C++11) son expresiones que no se evalúan (a menos que sean glvalues polimórficos y sena operandos de typeid), ya que estos operadores solo consultan las propiedades en tiempo de compilación de sus operandos. Por los tanto std::size_t n = sizeof(std::cout << 42); no realiza una salida en la consola.

Los operandos no evaluados se consideran expresiones completas a pesar de que son operandos sintácticamente en una expresión más larga (por ejemplo, esto significa que sizeof(T()) requiere que sea accesible T::~T)

(desde C++14)

Las expresiones de requerimientos también son expresiones sin evaluar.

(desde C++20)

[editar] Expresiones de valor descartado

Una expresión de valor descartado es una expresión que se utiliza solo por sus efectos secundarios. El valor calculado de la expresión se descarta. Dichas expresiones incluyen la expresión completa de cualquier sentencia de expresión, el argumento a la izquierda del operador coma incorporado, o el argumento de una expresión de cast a tipo void.

Las conversiones matriz a puntero y función a puntero nunca se aplican al valor calculado por una expresión de valor descartado. La conversión de lvalue a rvalue, sin embargo, se aplica, pero solo si la expresión es un glvalue calificado volatile y tiene una de las formas siguientes (quizás entre paréntesis)

  • expresión id
  • expresión de subíndice de matriz
  • expresión de acceso a miembro de clase
  • indirección
  • operación de puntero a miembro
  • expresiones condicionales cuando el segundo y tercer operandos son una de estas expresiones,
  • expresión de coma donde el operando derecho es una de estas expresiones.
Además, si la expresión es de tipo clase, se requiere un constructor copia volátil para incializar el rvalue temporal resultante. (hasta C++17)

Si la expresión no es un prvalue void (después de cualquier conversión de lvalue a rvalue que podría haber tenido lugar), la materialización temporal ocurre. Si el glvalue original es de tipo clase calificada volátil, se requiere un contructor copia volátil para iniciar el rvalue temporal resultante. Los compiladores pueden emitir advertencias cuando una expresión que no sea cast a void descarta un valor declarado [[nodiscard]]

(desde C++17)