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'?
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'?
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.
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.
[Nothing] (http://en.wikipedia.org/wiki/Unspecified_behavior) :) :) :) :) – dasblinkenlight
Las preguntas de tarea requieren una etiqueta de tarea. –
@Robert: No creo que nadie pregunte esto en su tarea ... – Bruce