6
votes

Pourquoi la sortie est-elle différente dans le cas de &&, &, ||?

Voici les segments de code

pouvez-vous expliquer pourquoi les sorties varient variables

1) xxx

sortie dans ce cas est 1

2) xxx

sortie dans ce cas est 3

3) xxx < p> sortie dans ce cas est 2

4) xxx

sortie dans ce cas est 3


0 commentaires

5 Réponses :


12
votes

Pourquoi la sortie est-elle différente dans le cas de &&, &, || ?

Tout comme dans C / C ++ && est évalué "paresseusement" tandis que & n'est pas.

si a est faux alors a && b retournera false sans évaluer B . .

même chose pour a || B : Si le premier opérande, A est vrai, l'expression entière est vraie et le deuxième opérande, B n'est jamais évalué. Pour a | B Cependant, les deux A et b seront évalués.

Ceci a des conséquences si l'opérande qui n'est pas évalué lors de l'utilisation de && (ou || ) a des effets secondaires, comme dans vos exemples.


Note latérale: Peu de programmeurs Java savent que ^ (xor) fonctionne aussi pour les booléens. (Une version ^^ n'existe pas simplement parce qu'il serait redondant.)


0 commentaires

1
votes

&& et || sont les opérateurs logiques et ou opérateurs, ils aboutissent toujours à une expression boolean . & et | sont des bittes et des opérateurs, ils effectuent une comparaison des bits de chaque côté. Pour plus d'informations sur ce que font ces opérateurs, voir Ce lien


2 commentaires

& et | peut être booléen aussi. Mais non, le DV n'était pas moi.


@Poly Good Point - Je n'ai pas spécifié de type résultant pour & et | pour cette raison comme je l'ai fait avec des opérateurs logiques. J'aurais expi explicitement indiqué que cependant.



1
votes

C'est parce que && et || sont des opérateurs logiques qu'un "mécanisme court-circut". Si vous utilisez || Et la première expression évalue en vrai, la seconde ne sera pas évaluée et je ne serai donc pas udée. et | sont des opérateurs bitwises qui effectuent des calculs de bits sur l'entrée. Celles-ci n'ont pas de courte circulation et, partant, l'ensemble de l'expression est évalué quoi qu'il arrive.


0 commentaires

1
votes

Le & et | Les opérateurs sont du bitwise et doivent donc avoir les deux côtés de l'expression évalués avant que l'opérateur puisse être utilisé, donc dans les cas 2 et 4 des deux côtés de l'opérateur est toujours évalué.

La différence entre les cas 1 et 3 est basée sur la logique de court-circuit.

Dans le cas 1 L'opérateur && dans la deuxième expression court-circuits comme false sur le premier false , causant la seconde moitié du expression à ne pas évaluer.

Dans le cas 3, le faux dans la première moitié de la deuxième expression conduit à l'évaluation de la seconde moitié de l'expression, incrémentation i . faux || Expr ne peut être que false si expr est également faux (il doit donc être évalué).


0 commentaires

7
votes

Il y a 4 boolean opérateurs binaires que nous sommes concernés ici:

  • && est le conditionnel et l'opérateur
    • & est l'opérateur logique et opérateur
    • || est le conditionnel ou l'opérateur
      • | est l'opérateur logique ou opérateur

        Voici le point clé:

        • "conditionnel" signifie qu'il court-circuits: il n'évalue pas le bon opérande s'il n'affectera pas le résultat de l'opération
        • "logique" ne court pas: elle évalue les deux opérandes, à gauche en premier, puis à droite.
        • le résultat de "et" est true uniquement si les deux opérandes sont true

0 commentaires