Voici les segments de code
pouvez-vous expliquer pourquoi les sorties varient variables p>
1) p> sortie dans ce cas est 1 p> 2) p> sortie dans ce cas est 3 p> 3) p> 4) p> sortie dans ce cas est 3 p> p>
5 Réponses :
Pourquoi la sortie est-elle différente dans le cas de &&, &, || ? p> blockQuote>
Tout comme dans C / C ++
&& code> est évalué "paresseusement" tandis que
& code> n'est pas. P>
si
a code> est faux alors
a && b code> retournera false sans évaluer
B p>. p>.
même chose pour
a || B CODE>: Si le premier opérande,
A code> est vrai, l'expression entière est vraie et le deuxième opérande,
B code> n'est jamais évalué. Pour
a | B code> Cependant, les deux
A code> et
b code> seront évalués. p>
Ceci a des conséquences si l'opérande qui n'est pas évalué lors de l'utilisation de
&& code> (ou
|| code>) a des effets secondaires, comme dans vos exemples. P>
Note latérale: Peu de programmeurs Java savent que
^ code> (xor) fonctionne aussi pour les booléens. (Une version
^^ code> n'existe pas simplement parce qu'il serait redondant.) P>
&& code> et
|| code> sont les opérateurs logiques et ou opérateurs, ils aboutissent toujours à une expression
boolean code>.
& code> et
| code> 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 P>
& code> et
| code> peut être
booléen code> aussi. Mais non, le DV n'était pas moi.
@Poly Good Point - Je n'ai pas spécifié de type résultant pour & code> et
| code> pour cette raison comme je l'ai fait avec des opérateurs logiques. J'aurais expi explicitement indiqué que cependant.
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. P>
Le La différence entre les cas 1 et 3 est basée sur la logique de court-circuit. p>
Dans le cas 1 L'opérateur Dans le cas 3, le & code> et
| code> 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 em> évalué. p>
&& code> dans la deuxième expression court-circuits comme
false code> sur le premier
false code>, causant la seconde moitié du expression à ne pas évaluer. p>
faux code> dans la première moitié de la deuxième expression conduit à l'évaluation de la seconde moitié de l'expression, incrémentation
i code>.
faux || Expr code> ne peut être que
false code> si
expr code> est également faux (il doit donc être évalué). P>
Il y a 4 Voici le point clé: P>
En d'autres termes, n'assumant aucune exception, etc. P>
boolean code> opérateurs binaires que nous sommes concernés ici: p>
&& code> est le conditionnel et l'opérateur
& code> est l'opérateur logique et opérateur li>
ul> li>
|| code> est le conditionnel ou l'opérateur
| code> est l'opérateur logique ou opérateur li>
ul> li>
ul>
true code> uniquement si les deux opérandes sont
true code>
false code>, le résultat est
false code> quel que soit l'opérande droit li>
ul> li>
true code> uniquement si au moins un opérande est
vrai code>
true code>, le résultat est
vrai code> quel que soit l'opérande droit li>
ul> li>
ul>
& code> et
| code> toujours em> évaluer les deux opérandes li>
&& code> et
|| code> évalue le bon opérande conditionnellement em>; Le bon opérande n'est évalué que si sa valeur pourrait affecter le résultat de l'opération binaire. Cela signifie que le bon opérande n'est pas évalué lorsque:
&& code> évalue vers
false code>
false code>) li>
ul> li>
|| code> est évalué vers
true code>
vrai code>) li>
ul> li>
ul> li>
ul>
Références h3>
& code>,
^ code> et
| code>
& code>, la valeur de résultat est
true code> si les deux valeurs d'opérande sont
true code>; Sinon, le résultat est
faux code>. li>
| code>, la valeur de résultat est
false code> si les deux valeurs d'opérande sont
false code>; Sinon, le résultat est
vrai code>. li>
ul> li>
&& code>
&& code> est comme
& code>, mais évalue son opérande à droite uniquement si la valeur de son opérande de gauche est
true code> . li>
ul> li>
|| code>
|| code> est comme
| code>, mais évalue son opérande à droite uniquement si la valeur de son opérande de gauche est
false code >. li>
ul> li>
ul>
Voir aussi h3>
& code>,
li>
ul>
^ code> et
| code>
Questions connexes h3>