2010-01-15 16 views
8

¿Invoca el siguiente código UB?¿Invoca el código siguiente UB?

int main(){ 
    volatile int i = 0; 
    volatile int* p = &i; 
    int j = ++i * *p; 
} 
+4

@Prasoon: No es correcto editar las publicaciones de otros simplemente formateando su código con su estilo favorito de sangría. ¿No leyó las pautas de StackOverflow: "Respetar al autor original"? (> _ <) –

Respuesta

6

sí que es un comportamiento indefinido ya que están tratando de violar la segunda regla ..

establece el estándar que

1) entre el anterior y el siguiente punto de la secuencia de un objeto tendrá su valor almacenado modificado como máximo una vez por la evaluación de una expresión.

2) Además, se tendrá acceso al valor anterior solo para determinar el valor que se almacenará.

Nota: El orden de evaluación de los operandos de * operador es no especificado y *p no es más que i.

+0

Te refieres al operador '*', supongo ... –

+0

Sí, error tipográfico: P ....... edité mi publicación :) –

+1

@Prasoon: No es correcto editar las publicaciones de los demás simplemente formatear su código con tu favorito estilo de sangría ¿No leyó las pautas de StackOverflow: "Respetar al autor original"? (> _ <) –

9

Sí - ya sea ++ i o * p (que es i) pueden ser evaluadas en primer lugar.

+0

pero independientemente del orden de evaluación, ¿el resultado sería el mismo correcto? –

+1

No. Si ++ i se evalúa primero, tiene 1 * 1. Si * p se evalúa primero, tiene 1 * 0. –

+0

¡Vaya! ¡Cómo no podría notar eso! ¡Gracias por la respuesta! –

Cuestiones relacionadas