2012-02-24 21 views
5

Si tengo la siguiente expresión:Orden de evaluación de expresiones en C

c = (a) * (b) 

¿Qué el estándar C90 dicen acerca de la evaluación de fin de la subexpresión 'a' y 'b'?

+8

[Nothing] (http://en.wikipedia.org/wiki/Unspecified_behavior) :) :) :) :) – dasblinkenlight

+0

Las preguntas de tarea requieren una etiqueta de tarea. –

+2

@Robert: No creo que nadie pregunte esto en su tarea ... – Bruce

Respuesta

11

No hay un orden especificado ya que el operador de multiplicación no es un punto de secuencia. Los puntos de secuencia incluyen el operador de coma, el final de una expresión completa y las llamadas a funciones. Por lo tanto, el orden de evaluación de (a) y (b) depende de la implementación del compilador. Por lo tanto, no debe intentar hacer algo en (a) que tenga un efecto secundario que desee que se vea en (b) para generar un resultado válido.

Por ejemplo:

int a=5; 
int b = (a++) * (a++); //<== Don't do this!! 

Si desea una lista completa de puntos de secuencia para C, se puede extraer una more thorough reference here.

+0

O, mejor aún, una búsqueda SO. – smparkes

+2

@Bruce: consulte el borrador de ANSI C http://flash-gordon.me.uk/ansi.c.txt, anexo A.2 – Christoph

+0

Su ejemplo muestra código incorrecto, pero no debido a una orden de evaluación. Obviamente, no es importante que 'a ++' se evalúe primero. – ugoren

3

El orden de evaluación de los operandos del operador binario * no está especificado en C90.

Aquí es el apartado correspondiente de la norma C90 (como la pregunta se le preguntó sobre C90):

(C90, 6,3) "A excepción de lo indicado por la sintaxis o de otra manera especificada más adelante (para la función de guardia operador(), & &, ||,:?., y los operadores por comas) el orden de evaluación de subexpresiones y el orden en el que los efectos secundarios tienen lugar son tanto unspecitied"

Para el operador *, si tome un ejemplo con operandos de efectos secundarios como:

c = f() * g(); 

la aplicación puede llamar f() primera o g() primera:

a = f(); 
b = g(); 
c = a * b; 

o

a = g(); 
b = f(); 
c = a * b; 

Ambos son válidos traducciones.

Cuestiones relacionadas