Pregunta Orden de evaluación de la expresión en C


Si tengo la siguiente expresión:

c = (a) * (b)

¿Qué dice la norma C90 sobre la evaluación del orden de las subexpresiones 'a' y 'b'?


5
2018-02-24 20:37


origen


Respuestas:


No hay un orden específico 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. Así, el orden de evaluación de (a) y (b) Es hasta la implementación del compilador. Por lo tanto no debes intentar hacer algo en (a) Eso tendría un efecto secundario que desea 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 los puntos de secuencia para C, puede consultar referencia más completa aquí.


11
2018-02-24 20:39



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

Aquí está el párrafo relevante del estándar C90 (como la pregunta sobre C90):

(C90, 6,3) "Excepto como se indica por la sintaxis o de otro modo especificado más adelante (para el operador de la función de llamada (), &&, ||,:?, Y los operadores de coma) el orden de evaluación de subexpresiones y el orden en el que. Los efectos secundarios que se producen son tanto inespecíficos ".

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

c =  f() * g();

la implementación puede llamar f() primero o g() primero:

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

o

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

Ambas son traducciones válidas.


3
2018-02-24 23:21