2009-08-30 12 views
7

Se si dispone di una funzione C che restituisce un numero intero, si potrebbe scrivere una dichiarazione come questa:Esiste un ordine di valutazione definito per & = and | =?

MyInt &= MyFunc(); 

... dove stiamo utilizzando l'operatore bit a bit-assegnazione AND.

La domanda è: è garantito che MyFunc() sia eseguito, anche se MyInt è uguale a zero?

Probabilmente, se si utilizzava l'operatore di assegnazione OR bit a bit (| =), MyFunc() sarebbe sempre eseguito, anche se MyInt fosse impostato su tutti?

In altre parole: la valutazione lazy è consentita in C per gli operatori bit a bit?

risposta

1
MyInt &= MyFunc(); 

è equivalente a:

MyInt = MyInt & MyFunc(); 

Il linguaggio afferma che l'operatore & non è in corto circuito. Tuttavia, un ottimizzatore potrebbe generare codice per non chiamare la funzione se MyInt era zero ed era sicuro che la funzione non ha avuto effetti collaterali. Dubito che tutti i compilatori facciano questo, perché probabilmente il test di runtime lo rende una pessimizzazione.

+1

Tranne che 'MyInt' viene valutato ** una volta ** (potrebbe importare quando si tratta di un'espressione con effetti collaterali.) –

+0

La cosa sul LHS dell'assegnazione non verrà valutata. –

+0

Neil: considera 'myMap [" test "] | = 10;' dove 'myMap.operator []' stampa qualcosa. Verrà stampato due volte nel secondo modulo, ma una volta nel modulo di assegnazione composto. –

8

No. Gli operatori bit a bit non vengono cortocircuitati. L'esecuzione di MyFunc() è garantita indipendentemente dal valore di MyInt.

Problemi correlati