2010-03-03 11 views
8

Duplicar posibles:
Could anyone explain these undefined behaviors (i = i++ + ++i , i = i++, etc…)¿Cuál sería el orden de evaluación de x = x ++ + ++ x; ¿ser?

En Java se especifica el orden de evaluación para ser de izquierda a derecha. ¿Es este el caso de C y C++ también, o depende de la implementación? Recuerdo que el orden de evaluación no está especificado para los argumentos de función, pero ¿qué pasa con las subexpresiones?

+0

Duplicados: http://stackoverflow.com/questions/949433/could-anyone-explain-these-undefined-behaviors-iiiii-etc http://stackoverflow.com/questions/1826414/whats-the-value- of-ii-closed http://stackoverflow.com/questions/1788696/how-the-code-behaves-different-for-java-andc-c-compiler – bk1e

+18

lol. El mod mod-cerró su propia pregunta: D – Earlz

+3

@ bk1e: Gracias por los enlaces. Tenía la sensación de que esto se trataría aquí antes, pero no surgió cuando hice la pregunta. Pensé que la manera más rápida de encontrar el original sería simplemente preguntar. :) –

Respuesta

13

No se especifica cuál de los argumentos a + se evalúa primero, pero eso ni siquiera importa, porque en C y C++, modificar el mismo objeto dos veces sin un punto de secuencia intermedio es un comportamiento completamente indefinido.

Aquí está modificando x tres veces sin un punto de secuencia intermedia, por lo que está bien fuera de la reserva;)


La parte pertinente de la norma C99 es "6.5" expresiones:

2 Entre el anterior y el siguiente punto secuencia de un objeto tendrá su valor almacenado modificado como máximo una vez por la evaluación de una n expresión. Además, el valor anterior será de solo lectura para determinar el valor que será almacenado.

y

3 La agrupación de operadores y operandos se indica por la sintaxis . Excepto como se especifica más adelante (para la función de llamada(), & &, ||,:?, y comas operadores), el orden de evaluación de subexpresiones y el orden en el que efectos secundarios tienen lugar son tanto no especificado .


Es posible escribir código legal que demuestra el orden no especificado de evaluación - por ejemplo:

#include <stdio.h> 

int foo(void) 
{ 
    puts("foo"); 
    return 1; 
} 

int bar(void) 
{ 
    puts("bar"); 
    return 2; 
} 

int main() 
{ 
    int x; 

    x = foo() + bar(); 
    putchar('\n'); 

    return x; 
} 

(Es sin especificar si se obtiene la salida de foobar o barfoo).

+0

Gracias por la respuesta rápida. –

2

El estándar C no garantiza que el incremento posterior realmente "suceda" después del pre-incremento. Entonces ese es un comportamiento indefinido.

1

Esa no es una declaración C válida, por lo que no tiene sentido hablar sobre la orden de evaluación.

+1

¿Qué quiere decir con "válido"? Se compila con éxito en gcc y g ++. –

+4

Si un archivo ha sido compilado correctamente por gcc no tiene nada que ver con si contiene declaraciones C válidas o no. El estándar C determina qué es C válido, no un compilador. –

+4

Esta afirmación es sintácticamente válida, aunque semánticamente incorrecta ya que causa un comportamiento indefinido. – qrdl

3

C++ 03 Estándar 5.4

Excepto donde se indique, el orden de evaluación de los operandos de operadores y subexpresiones de expresiones individuales individuales, y el orden en el que efectos secundarios tienen lugar, es unspecified.53) entre el anterior y el siguiente punto de secuencia un objeto escalar tendrá su valor almacenado modificado como máximo una vez por la evaluación de una expresión. Además, el valor anterior deberá ser al que se tenga acceso solo para determinar el valor que se almacenará. Los requisitos de este párrafo se cumplirán para cada orden permitida de las subexpresiones de una expresión completa; de lo contrario, el comportamiento no está definido.

... por lo tanto, indefinido y depende de la implementación.

Cuestiones relacionadas