15-12-2012, 06:09 PM
Un exemple de and non-paresseux qui ne soit pas c*n?
Je veux incrémenter $i et $j d'une unité, et si, avant incrémentation, tous deux ne sont pas à 0, j'exécute une action:
Si je ne me trompes pas, $i++ et $j++ incrémentent i et j d'une unité, et renvoie la valeur AVANT incrémentation.
Donc, étude de cas: pour $i=0 et $j=1.
Si l'opérateur est paresseux, alors $i++ est évaluée, $i vaut donc 1, et ($i++) renvoie 0, qui vaut "false" en booléen. Donc, l'expression n'est pas évaluée plus en avant: l'action dans le if n'est pas exécutée, et $i=1 et $j=1.
Si l'opérateur est non-paresseux, alors $i++ est évaluée, $i vaut donc 1 et ($i++) renvoie 0 qui vaut false en booléen. Le membre suivant est alors évalué. Donc $j vaut 2, et ($j++) renvoie 1 qui est évalué à true. L'expression est alors (false and true) et l'action n'est pas effectuée, mais à la sortie du if, cette fois, $i=1 et $j=2!
Donc, la paresse de l'opérateur peut avoir un intérêt, si par exemple, j'avais voulu incrémenter i et j dans tous les cas et ne faire l'action que si les deux, avant incrémentation, étaient non-nuls.
Avec un opérateur paresseux, il faudrait écrire:
Je veux incrémenter $i et $j d'une unité, et si, avant incrémentation, tous deux ne sont pas à 0, j'exécute une action:
Code :
if (($i++) and ($j++))
{
// action
}
Si je ne me trompes pas, $i++ et $j++ incrémentent i et j d'une unité, et renvoie la valeur AVANT incrémentation.
Donc, étude de cas: pour $i=0 et $j=1.
Si l'opérateur est paresseux, alors $i++ est évaluée, $i vaut donc 1, et ($i++) renvoie 0, qui vaut "false" en booléen. Donc, l'expression n'est pas évaluée plus en avant: l'action dans le if n'est pas exécutée, et $i=1 et $j=1.
Si l'opérateur est non-paresseux, alors $i++ est évaluée, $i vaut donc 1 et ($i++) renvoie 0 qui vaut false en booléen. Le membre suivant est alors évalué. Donc $j vaut 2, et ($j++) renvoie 1 qui est évalué à true. L'expression est alors (false and true) et l'action n'est pas effectuée, mais à la sortie du if, cette fois, $i=1 et $j=2!
Donc, la paresse de l'opérateur peut avoir un intérêt, si par exemple, j'avais voulu incrémenter i et j dans tous les cas et ne faire l'action que si les deux, avant incrémentation, étaient non-nuls.
Avec un opérateur paresseux, il faudrait écrire:
Code PHP :
<?php
$i=0;
$j=1;
$i_old = ($i++);
$j_old = ($j++);
if ($i_old and $j_old)
// action
Ce qui est plus lourd que l'écriture avec un non-paresseux:
Code :
$i=0
$j=1;
if (($i++) and ($j++))
// action
Comme quoi les deux opérateurs peuvent avoir leur intérêt, ni l'un ni l'autre se sont "con" dès l'instant où la condition n'est pas une simple évaluation directe, mais qu'elle inclue une action (incrémentation par exemple).