Salut,
Ton erreur de compréhension vient que les choses ne se passent pas au niveau des parenthèses, mais bien au niveau de l'opérateur logique &&.
L'opérateur logique && est correspond à un AND "optimisé", et, pour comprendre ce que je vais t'expliquer, rien ne vaut la table de vérité pour AND
si tu mets deux expressions pouvant chacune être représentée par une valeur "vrai" ou "faux" dans une relation AND, tu te trouves confronté à quatre combinaisons possible, avec les résultat suivants:
1 2 3 4 5
| expr1 | expr2 | expr1 AND expr2
faux | faux | faux
faux | vrai | faux
vrai | faux | faux
vrai | vrai | vrai |
Tu constateras que, sur les quatre combinaisons possibles, trois donneront "faux" comme résultat et une seule donnera "vrai" comme résultat.
La combinaison donnant une valeur "vrai" comme résultat est ce que l'on appelle "l'état unique".
Tu constateras aussi que le résultat sera d'office "faux" si la première expression correspond déjà à la valeur "faux".
Si l'on dit que l'opérateur && est un opérateur "optimisé", c'est simplement parce que, s'il arrive à déterminer, après avoir évalué une (ou plusieurs) expression(s) que le résultat ne sera de toutes façons pas l'état unique, il n'évaluera purement et simplement pas l'expression suivante.
Ainsi, lorsque l'on est confronté à un code proche de
if ( i < max && (j++ == 10))
j++ ne sera effectué que si i est bel et bien plus petit que max.
Si i est égal (ou supérieur) à max, la deuxième expression (j++==10) ne sera purement et simplement pas évaluée, et j ne sera donc même pas incrémenté.
Par contre, avec un code proche de
1 2 3
|
j++;
if(i < max && (j == 10)) |
j est incrémenté de manière inconditionnelle (quelle que puisse être la valeur de j ou celle de i) et ce n'est qu'après avoir incrémenté j que l'on va vérifier si i est bel et bien plus petit que max et que j est égal à 10.
Est-ce que cette explication te semble plus claire
Partager