operator c++ c operators pre-increment operator-precedence

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.