web-dev-qa-db-fra.com

Existe-t-il une différence entre utiliser un opérateur logique et un opérateur bit à bit dans un bloc if en Java?

Le contenu des deux éléments suivants si des blocs doivent être exécutés:

if( booleanFunction() || otherBooleanFunction() ) {...}
if( booleanFunction() | otherBooleanFunction() ) {...}

Alors, quelle est la différence entre | et ||?

Remarque: j'ai examiné la question et trouvé ma propre réponse, que j'ai incluse ci-dessous. N'hésitez pas à me corriger ou à donner votre propre point de vue. Il y a sûrement place à amélioration!

14
Miquel

L'opérateur logique fonctionne sur des booléens et l'opérateur au niveau des bits sur des bits. Dans ce cas, l'effet sera le même, mais il y a deux différences:

  1. L’opérateur au niveau du bit n’est pas fait pour ça, ce qui rend la lecture plus difficile mais surtout
  2. L'opérateur logique OR évaluera la première condition. Si c'est vrai, peu importe le résultat de la condition suivante, le résultat sera vrai, donc la deuxième clause n'est pas exécutée

Voici un code pratique pour le prouver:

public class OperatorTest {

    public static void main(String[] args){
        System.out.println("Logical Operator:");
        if(sayAndReturn(true, "first") || sayAndReturn(true, "second")){
            //doNothing
        }

        System.out.println("Bitwise Operator:");
        if(sayAndReturn(true, "first") | sayAndReturn(true, "second")){
            //doNothing
        }
    }

    public static boolean sayAndReturn(boolean ret, String msg){
        System.out.println(msg);
        return ret;
    }
}
14
Miquel

Les deux ont des usages différents. Bien que dans de nombreux cas (lorsqu'il s'agit de booléens), ils puissent sembler avoir le même effet, il est important de noter que le OU-logique est un court-circuit, ce qui signifie que si son premier argument a la valeur true, le second argument est laissé. non évalué. L'opérateur au niveau du bit évalue les deux arguments indépendamment.

De même, l’opérateur AND logique est un court-circuit, ce qui signifie que si son premier argument est évalué à false, le second est laissé non évalué. Encore une fois, le bitwise-AND n'est pas. 

Vous pouvez voir cela en action ici:

int x = 0;
int y = 1;
System.out.println(x+y == 1 || y/x == 1);
System.out.println(x+y == 1 |  y/x == 1);

La première instruction print fonctionne très bien et renvoie true car le premier argument est évalué à true et l'évaluation est donc arrêtée. La deuxième instruction d'impression se trompe puisqu'il ne s'agit pas d'un court-circuit et qu'une division par zéro est rencontrée. 

37
arshajii

pour les programmeurs, il n'y a qu'une seule différence.

  1. vos opérateurs logiques sont des opérateurs logiques, c'est-à-dire. ils testent seulement une condition et obtiennent un résultat basé sur cela.

booleanFunction () || otherBooleanFunction () sera vrai si l’un est vrai. De même, booleanFunction () && otherBooleanFunction () sera faux si l'un ou l'autre est faux. Alors, pourquoi tester l'autre. c'est ce que font les opérateurs logiques.

Mais au niveau des bits, vérifiez les deux. Une application fréquente de ce concept est la suivante.

if(someObject != null && someObject.somemethod())

Donc, dans ce cas, si vous remplacez && par &, attendez un sinistre. Vous obtiendrez bientôt une méchante NullPointerException ...

6
Ahmad
if( booleanFunction() || otherBooleanFunction() ) {...}

Dans cette condition, si booleanFunction() renvoie true, alors otherBooleanFunction() ne sera pas exécuté.

if( booleanFunction() | otherBooleanFunction() ) {...}

Mais dans l'opérateur des bits, les deux fonctions - booleanFunction() et otherBooleanFunction() seraient exécutées, peu importe booleanFunction(), renvoie true ou false

4
Pramod Kumar

Différence entre opérateur logique et bits par bits - 1. L'opérateur au niveau du bit travaille sur le bit alors que l'opérateur logique travaille sur l'instruction. 2. Bitwise et est représenté par & alors que logique et est représenté par &&. 3. Bitwise ou est représenté par | alors que ou est représenté par ||.

0
Rajeev jha