2012-04-27 13 views

Respuesta

12

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().

http://en.wikipedia.org/wiki/Sequence_points

2

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.

+2

¿Dónde hay un argumento de función en su código? – Pubby

+0

@Pubby substitute function with operator here. –

0

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.

7

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.

0

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.

Cuestiones relacionadas