2009-08-30 12 views
7

Si usted tiene una función de C que devuelve un entero, se podría escribir una declaración como esta:¿Existe un orden de evaluación definido para & = y | =?

MyInt &= MyFunc(); 

... en el que estamos usando el operador de bits-y asignación.

La pregunta es: ¿se garantiza que MyFunc() se ejecutará, incluso si MyInt es igual a cero?

Likwise, si utilizáramos el operador de asignación O bit a bit (| =), ¿MyFunc() se ejecutaría siempre, incluso si MyInt se configurara para todos?

Dicho de otra manera: ¿está permitida la evaluación diferida en C para operadores bit a bit?

Respuesta

1
MyInt &= MyFunc(); 

es equivalente a:

MyInt = MyInt & MyFunc(); 

El lenguaje indica que el operador & no está en cortocircuito. Sin embargo, un optimizador podría generar código para no llamar a la función si MyInt era cero y estaba seguro de que la función no tenía efectos secundarios. Dudo que ningún compilador lo haga, ya que la prueba de tiempo de ejecución probablemente lo pesima.

+1

Excepto que 'MyInt' se evalúa ** una vez ** (puede ser importante cuando se trata de una expresión con efectos secundarios) –

+0

Lo que está en el LHS de la tarea no será evaluado. –

+0

Neil: considere 'myMap [" test "] | = 10;' donde 'myMap.operator []' imprime algo. Se imprimirá dos veces en el segundo formulario, pero una vez en el formulario de asignación compuesta. –

8

No. Los operadores bit a bit no están en cortocircuito. La ejecución de MyFunc() está garantizada independientemente del valor de MyInt.

Cuestiones relacionadas