Múltiples operaciones de preincremento en una variable en C ++ (C?)

¿Por qué la siguiente comstackción en C ++?

int phew = 53; ++++++++++phew ; 

El mismo código falla en C, ¿por qué?

Eso es porque en C++ el operador de lvalue devuelve un valor lvalue y requiere que su operando sea un valor lvalue .

++++++++++phew ; interpretado como ++(++(++(++(++phew))))

Sin embargo, su código invoca el Undefined Behaviour porque está tratando de modificar el valor de phew más de una vez entre dos puntos de secuencia .

En C , el operador de rvalue devuelve un valor rvalue y requiere que su operando sea un valor lvalue . Entonces su código no se comstack en modo C.

Nota: Los dos informes de defectos DR # 637 y DR # 222 son importantes para comprender el razonamiento de comportamiento a continuación.


Para la 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 l o leer el valor de un valor l. Tenga en cuenta que C ++ 0x ya no tiene puntos de secuencia y esto está redactado en términos de “secuencia antes” / “secuencia después”. Y se dice que

Si un efecto secundario en un objeto escalar no se está secuenciando en relación con otro efecto secundario en el mismo objeto escalar o con un cálculo de valor que utiliza el valor del mismo objeto escalar, el comportamiento no está definido.

++v es equivalente a v += 1 que es equivalente a v = v + 1 (excepto que v solo se evalúa una vez). Esto cede a ++ (v = v + 1) que escribiré como inc = inc + 1 , donde inc refiere al resultado lvalue de v = v + 1 .

En C ++ 0x ++ ++v no es un comportamiento indefinido porque para a = b la asignación se secuencia después del cálculo del valor de by a, pero antes del cálculo del valor de la expresión de asignación. Se deduce que la asignación en v = v + 1 se secuencia antes del cómputo de 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 tareas serán secuenciadas y no hay un comportamiento indefinido.