operator - MĂșltiples operaciones de preincremento en una variable en C++(C?)
c++ operator (2)
Esto se debe a que en C++
, el operador de lvalue
devuelve un lvalue
y requiere que su operando sea un lvalue
.
++++++++++phew ;
interpretado como ++(++(++(++(++phew))))
Sin embargo, su código invoca un Undefined Behaviour
porque está intentando modificar el valor de phew
más de una vez entre dos puntos de secuencia .
En C
, el operador de rvalue
devuelve un rvalue
y requiere que su operando sea un lvalue
. Entonces tu código no se compila en modo C.
¿Por qué se compila lo siguiente en C ++?
int phew = 53;
++++++++++phew ;
El mismo código falla en C, ¿por qué?
Nota: Los dos informes de defectos DR#637 y DR#222 son importantes para comprender la lógica de comportamiento de la siguiente información.
Para explicación, en C ++ 0x hay value computations
y side effects
. Un efecto secundario, por ejemplo, es una asignación, y un cálculo de valor es determinar a qué se refiere un valor de l o leer el valor de un valor de l. Tenga en cuenta que C ++ 0x ya no tiene puntos de secuencia y este material está redactado en términos de "secuenciada antes" / "secuenciada después". Y se afirma que
Si un efecto secundario en un objeto escalar no tiene secuencia en relación con otro efecto secundario en el mismo objeto escalar o un cálculo de valor utilizando el valor del mismo objeto escalar, el comportamiento es indefinido.
++v
es equivalente a v += 1
que es equivalente a v = v + 1
(excepto que v solo se evalúa una vez). Esto da como resultado ++ (v = v + 1)
que escribiré como inc = inc + 1
, donde inc
refiere al resultado de valor de v = v + 1
.
En C ++ 0x ++ ++v
no es un comportamiento indefinido porque para a = b
la secuencia se secuencia después del cálculo del valor de b y a, pero antes del cálculo del valor de la expresión de la asignación. De ello se deduce que la asignación en v = v + 1
se secuencia antes del cálculo del valor de inc
. Y la asignación en inc = inc + 1
se secuencia después del cálculo del valor de inc
. Al final, ambas asignaciones se secuenciarán y no habrá un comportamiento indefinido.