En el siguiente código:orden de operaciones C - foo() + barra() - ¿debe llamarse foo antes de la barra?
int foo();
int bar();
int i;
i = foo() + bar();
personal ¿Se garantiza el estándar de C que se llama antes de foo
bar
se llama?
En el siguiente código:orden de operaciones C - foo() + barra() - ¿debe llamarse foo antes de la barra?
int foo();
int bar();
int i;
i = foo() + bar();
personal ¿Se garantiza el estándar de C que se llama antes de foo
bar
se llama?
No, no hay punto de secuencia con +
. De hecho, hay una cita en la página de Wikipedia al respecto que responde a su pregunta:
Considere dos funciones f() y g(). En C y C++, el operador + no está asociado con un punto de secuencia, y por lo tanto en la expresión f() + g() es posible que primero se ejecute f() o g().
No, no lo es. El orden de evaluación de la función y los argumentos del operador no están definidos.
La norma solo dice que las llamadas a foo
y bar
no se pueden intercalar, lo que puede ocurrir cuando se evalúan subexpresiones sin llamadas a funciones.
No, esto no está definido. Desde K página & R 200:
el orden de evaluación de expresiones es, con ciertas excepciones, no definidos, incluso si las subexpresiones implican efectos secundarios. Es decir, a menos que la definición del operador garantice que sus operandos se evalúan en un orden particular, la implementación es libre de evaluar operandos en cualquier orden, o incluso de intercalar su evaluación.
La página 205 de K & R describe los operadores aditivos, y no define el orden del evaluador de los dos operandos.
Es no especificada, y en el caso de C99 la cita relevante es 6,5/3:
Excepto según se especifica más adelante (para la función de llamar
()
,&&
,||
,?:
, y operadores coma) , el orden de evaluación de las subexpresiones y el orden en el que se producen los efectos secundarios no están especificados.
En su ejemplo, foo()
bar()
y son subexpresiones de la plena expresión i = foo() + bar()
.
El "después" de llamadas de función no es directamente relevante aquí, pero para referencia es 6.5.2.2/10:
el orden de evaluación del designador de función, los argumentos reales, y subexpresiones dentro de los argumentos reales es sin especificar, pero hay un punto de secuencia antes de la llamada real.
Para &&
es 6.5.13/4:
A diferencia del bit a bit & operador binario, las garantías & & operador de izquierda a derecha evaluación; hay un punto de secuencia después de la evaluación del primer operando.
Desde +
no está en la lista de operadores en la parte superior, y &&
+
son "diferencia" de la misma manera que &&
y &
son "diferencia", y esto es precisamente lo que estás preguntando acerca . A diferencia de &&
, +
hace no garantía de evaluación de izquierda a derecha.
La respuesta correcta donde trabajo es "Si el pedido es importante, el código no se puede mantener independientemente de lo que diga la norma que sucederá". Si debe haber evaluado a foo() antes que bar(), evalúe foo() explícitamente antes de bar(). La base para esto no es que todos los programadores conozcan los estándares, y aquellos que no saben si el autor original sí lo hizo.
¿Dónde hay un argumento de función en su código? – Pubby
@Pubby substitute function with operator here. –