La precedencia no tiene un efecto en el orden de evaluación (excepto cuando sea necesario, algunas sub-expresiones podrían necesitar ser evaluadas antes que otras debido a la precedencia). Por ejemplo, en la expresión simple:
a() + b() + c() * d()
a pesar de que la multiplicación tiene precedencia sobre Además, el compilador es libre de realizar las llamadas a las funciones en cualquier orden que le gusta, y podría llamar a()
o b()
antes o después de que se realiza la multiplicación. Obviamente, tiene que evaluar c()
y d()
antes de realizar la multiplicación. Si estas funciones tienen efectos secundarios (como la modificación y el uso de variables globales), el orden de evaluación indeterminado podría generar resultados inesperados.
Sin embargo, para algunos operadores, la norma prescribe un estricto orden de evaluación. Es esto decir sobre ||
lógico u operador:
A diferencia del bitwise | operador, || el operador garantiza la evaluación de izquierda a derecha; hay un punto de secuencia después de la evaluación del primer operando. Si el primer operando compara desigual a 0, el segundo operando no se evalúa.
Así que no sólo la ||
proporcionan una garantía de pedidos, sino que también garantiza que, bajo ciertas condiciones, el segundo operando no será evaluado en absoluto.
(también dice algo similar para el &&
- excepto que en ese caso el 2do operando no se evalúa si el primero evalúa a 0. Pero en su ejemplo, el ||
es lo primero).
Otros operadores que proporcionan cierta garantía de pedido incluyen el operador de coma y la llamada de función (lo que garantiza que los argumentos han sido evaluados, pero no el orden en que se han evaluado dichos argumentos).
Te refieres a LHS. – SLaks
@SLaks: Sí, lo hago. Editado – sepp2k