48 votes

Quels sont les cas dans lesquels il est préférable d'utiliser inconditionnel ET (& au lieu de &&)

Je voudrais savoir certains cas en Java (ou plus généralement: dans la programmation) lorsqu'il est préféré dans les expressions booléennes pour utiliser l'inconditionnel AND (&) au lieu du conditionnel version (&&).

Je sais comment ils fonctionnent, mais je ne peux pas penser à un cas quand utiliser le single & il vaut la peine.

60voto

Louis Wasserman Points 67557

J'ai trouvé des cas dans la vie réelle où les deux parties de l'expression ont été vraiment bon marché, il réduit d'un ordre de la nanoseconde ou deux pour éviter la branche et de l'utilisation de l'inconditionnel & au lieu de &&. (Ces derniers sont extrêmement haute performance de maths utilitaires, bien; je n'ai presque jamais l'utiliser dans un autre code, et je n'aurais pas fait de toute façon sans exhaustive des analyses comparatives pour prouver que c'était mieux).

(Donner des exemples précis, x > 0 va être super pas cher et le côté-effet-gratuit. Pourquoi la peine de risquer une branche erreurs de prédiction afin d'éviter un test qui va être si bon marché de toute façon? Bien sûr, puisque c'est un boolean le résultat final est destiné à être utilisé dans une succursale de toute façon, mais if (x >= 0 && x <= 10) comprend deux branches, et if (x >= 0 & x <= 10) ne comporte qu'un seul.)

20voto

assylias Points 102015

La seule différence est qu' && et || arrêt de l'évaluation dès qu'il est connu. Ainsi, par exemple:

if (a != null && a.get() != null)

fonctionne bien avec &&, mais avec & vous pourriez obtenir un NullPointerException si a est null.

Le seul cas que je peux réfléchir à l'endroit où vous souhaitez utiliser & si le deuxième opérande est un effet secondaire, par exemple (sans doute pas le meilleur exemple mais vous obtenez le point):

public static void main(String[] args) {
    int i = 1;
    if (i == 0 & ++i != 2) {
    }
    System.out.println(i); //2
    i = 1;
    if (i == 0 && ++i != 2) {
    }
    System.out.println(i); //1
}

Cependant, cela ressemble à malodorante code pour moi (dans les deux cas).

15voto

Taskmaster Points 356

Le && permet à la jvm de faire de court-circuit de l'évaluation. C'est, si le premier argument est faux, alors il n'a pas besoin de s'embêter à la vérification de la deuxième argument.

Un seul et va exécuter des deux côtés, peu importe.

Alors, comme un exemple artificiel, vous pourriez avoir:

if (account.isAllowed() & logAccountAndCheckFlag(account))
    // Do something

Dans cet exemple, vous pouvez toujours connecter le fait que le propriétaire du compte a tenté de faire quelque chose.

Je ne pense pas que j'ai jamais utilisé un seul et dans la programmation commerciale.

11voto

Santosh Points 9794

Wikipédia a bien décrit le Court-Circuit de l'Évaluation

Où préférez-vous non court-circuit opérateurs ?

De la même lien:

  • Non testé deuxième condition conduit à impayée effet secondaire
  • Code efficacité

Court-circuit accidentel peut conduire à des erreurs dans la direction de la prévision sur moderne les processeurs, et de réduire considérablement les performances (un exemple notable est hautement optimisé ray aligné avec l'axe de la boîte intersection code dans les rayons traçage)[clarification nécessaire]. Certains compilateurs peuvent détecter de tels cas et émettent plus rapidement le code, mais il n'est pas toujours possible en raison de possible les violations de la norme. Hautement optimisé le code devrait utiliser d'autres les moyens pour le faire (comme le manuel d'utilisation de code assembleur)

7voto

harold Points 14256

Si il ya des effets secondaires qui doivent se produire, mais c'est un peu moche.

Le bit à bit ET (&) est surtout utile pour juste que - bit-à-bit de mathématiques.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X