2009-08-30 5 views
7

Si vous avez une fonction C qui retourne un entier, vous pourriez écrire une déclaration comme ceci:Existe-t-il un ordre d'évaluation défini pour & = et | =?

MyInt &= MyFunc(); 

... où nous utilisons l'opérateur logique binaire mission.

La question est: MyFunc() est-il garanti d'être exécuté, même si MyInt est égal à zéro? Par ailleurs, si nous utilisions l'opérateur d'affectation OR au niveau du bit (| =), MyFunc() serait-il toujours exécuté, même si MyInt était défini sur tous les uns? En d'autres termes, l'évaluation paresseuse est-elle permise en C pour les opérateurs au niveau du bit?

Répondre

1
MyInt &= MyFunc(); 

équivaut à:

MyInt = MyInt & MyFunc(); 

La langue indique que l'opérateur & est pas court-circuiter. Cependant, un optimiseur pourrait générer du code pour ne pas appeler à la fonction si MyInt était nul et il était sûr que la fonction n'avait pas d'effets secondaires. Je doute que tous les compilateurs le fassent, car le test d'exécution en fait probablement une pessimisation.

+1

Sauf que 'MyInt' est évalué ** une fois ** (peut être important quand c'est une expression avec des effets secondaires.) –

+0

La chose sur le LHS de l'affectation ne sera pas évaluée. –

+0

Neil: considère myMap ["test"] | = 10; 'where' myMap.operator [] 'imprime quelque chose. Il sera imprimé deux fois dans la deuxième forme mais une fois dans le formulaire d'assignation composé. –

8

Non Les opérateurs bit à bit ne sont pas court-circuités. MyFunc() exécution est garantie indépendamment de la valeur de MyInt.

Questions connexes