2010-12-04 5 views
5

Y at-il une séquence garantie d'exécution du code Java suivant:points de séquence en java

int i = getA() + getB(); 

est-getA() toujours exécuté avant getB(), comme toute personne moyenne attendre?

+0

Remarque, Java garantit que la méthode est appelée dans l'ordre, mais la CPU peut réorganiser les charges si elle n'a aucun effet sur le résultat. Par exemple, si B est en cache mais que A ne l'est pas, il n'attendra pas que A se termine avant de commencer à charger B, mais il s'assurera que cela n'a aucun impact sur le résultat. –

+0

Maintenant, c'est intéressant. Les deux fonctions n'ont aucun effet secondaire classique l'une sur l'autre. C'est juste que 'getA()' peut prendre un certain temps à s'exécuter alors que 'getB()' est presque un non-op. Je veux m'assurer que le second reviendra dès que le premier sera de retour, donc la commande est importante. Je pourrais le réécrire bien sûr. – milan

Répondre

13

Oui, c'est. À partir du JLS, section 15.7:

Le langage de programmation Java garantit que les opérandes des opérateurs semblent être évalués dans un ordre d'évaluation spécifique, à savoir, de gauche à droite.

Il est recommandé que le code ne se base pas de façon cruciale sur cette spécification. Le code est généralement plus clair lorsque chaque expression contient au plus un effet secondaire, comme son opération la plus externe, et lorsque le code ne dépend pas exactement de quelle exception résulte de l'évaluation de gauche à droite des expressions.

...

L'opérande gauche d'un opérateur binaire semble être pleinement évalué avant qu'une partie de l'opérande de droite est évaluée.

et aussi:

Le langage de programmation Java garantit également que chaque opérande d'un opérateur (à l'exception des opérateurs conditionnels & &, ||, et :) semble être pleinement évalué avant qu'une partie? de l'opération elle-même est effectuée.

+0

en lisant votre réponse me rappelle que je le savais déjà :) – milan

Questions connexes