J'ai une base de code où les développeurs ont décidé d'utiliser AND
et OR
au lieu de &&
et ||
.
Je sais qu'il existe une différence dans la priorité des opérateurs (&&
va avant and
), mais avec le cadre donné ( PrestaShop pour être précis), ce n'est clairement pas une raison.
Quelle version utilisez-vous? and
est-il plus lisible que &&
? Ou n'y a-t-il pas de différence?
Si vous utilisez AND
et OR
, vous serez éventuellement dérouté par quelque chose comme ceci:
$this_one = true;
$that = false;
$truthiness = $this_one and $that;
Vous voulez deviner ce que $truthiness
est égal?
Si vous avez dit false
... bzzzt, désolé, faux!
$truthiness
ci-dessus a la valeur true
. Pourquoi? =
a une priorité supérieure à and
. L'ajout de parenthèses pour montrer l'ordre implicite rend ceci plus clair:
($truthiness = $this_one) and $that
Si vous utilisiez &&
au lieu de and
dans le premier exemple de code, cela fonctionnerait comme prévu et serait false
.
Comme indiqué dans les commentaires ci-dessous, cela fonctionne également pour obtenir la valeur correcte, car les parenthèses ont une priorité supérieure à celle de =
:
$truthiness = ($this_one and $that)
En fonction de l'utilisation qui en est faite, cela peut s'avérer nécessaire et même pratique. ____ http://php.net/manual/en/language.operators.logical.php
// "||" has a greater precedence than "or"
// The result of the expression (false || true) is assigned to $e
// Acts like: ($e = (false || true))
$e = false || true;
// The constant false is assigned to $f and then true is ignored
// Acts like: (($f = false) or true)
$f = false or true;
Mais dans la plupart des cas, cela ressemble davantage à un goût de développeur, comme à toutes les occurrences de ce que j'ai vu dans le framework CodeIgniter, comme @Sarfraz l'a mentionné.
Puisque and
a une priorité inférieure à =
, vous pouvez l'utiliser dans l'affectation de conditions:
if ($var = true && false) // Compare true with false and assign to $var
if ($var = true and false) // Assign true to $var and compare $var to false
Par sécurité, je mets toujours mes comparaisons entre parenthèses et les espace. De cette façon, je n'ai pas à compter sur la priorité des opérateurs:
if(
((i==0) && (b==2))
||
((c==3) && !(f==5))
)
La précédence diffère entre && et et (&& a une priorité supérieure à and), ce qui crée de la confusion lorsqu'il est combiné à un opérateur ternaire. Par exemple,
$predA && $predB ? "foo" : "bar"
retournera une chaîne alors que
$predA and $predB ? "foo" : "bar"
retournera un boolean .
quelle version utilisez-vous?
Si les normes de codage pour la base de code pour laquelle je rédige le code spécifie quel opérateur doit être utilisé, je certainement l'utiliserai. Si ce n'est pas le cas et que le code dicte qui doit être utilisé (pas souvent, peut être facilement contourné), je l'utilise. Sinon, probablement&&
.
Est-ce que 'et' est plus lisible que '&&'?
Est-ce plus lisible pour vous. La réponse est oui et non en fonction de nombreux facteurs, dont le code de l'opérateur et même de la personne qui le lit!
|| il y a ~ différence?
Oui. Voir opérateurs logiques pour ||
et opérateurs au niveau des bits pour ~
.
Laissez-moi vous expliquer la différence entre “et” - “&&” - “&”.
"&&" et "et" sont tous deux opérations AND logiques et font la même chose, mais la priorité de l'opérateur est différente.
La priorité (priorité) d'un opérateur spécifie comment "étroitement" il lie deux expressions. Par exemple, dans l'expression 1 + 5 * 3, la réponse est 16 et non 18 car l'opérateur de multiplication ("*") a une priorité plus élevée que l'opérateur d'addition ("+").
Les mélanger en une seule opération peut donner des résultats inattendus dans certains cas Je recommande de toujours utiliser &&, mais c'est votre choix.
Par contre, "&" est un opération au niveau du bit AND . Il est utilisé pour l'évaluation et la manipulation de bits spécifiques dans la valeur entière.
Exemple si vous faites (14 & 7) le résultat serait 6.
7 = 0111
14 = 1110
------------
= 0110 == 6
En fonction de la langue que vous utilisez, il est généralement préférable d'utiliser
&&
et||
plutôt queand
etor
, sauf dans des langues telles que Python, oùand
etor
sont utilisés et où&&
et||
n'existent pas.
Un autre exemple intéressant utilisant des instructions if
sans opérations d'assignation =
.
if (true || true && false); // is the same as:
if (true || (true && false)); // TRUE
et
if (true || true AND false); // is the same as:
if ((true || true) && false); // FALSE
parce que AND
a une priorité inférieure et donc ||
une priorité supérieure.
Celles-ci sont différentes dans les cas de true, false, false
et true, true, false
. Voir https://ideone.com/lsqovs pour un exemple plus élaboré.
Je suppose que c'est une question de goût, même si (à tort) les mélanger pourrait causer certains comportements indésirables:
true && false || false; // returns false
true and false || false; // returns true
Par conséquent, en utilisant && et || est plus sûr car ils ont la plus haute préséance. En ce qui concerne la lisibilité, je dirais que ces opérateurs sont assez universels.
UPDATE: À propos des commentaires disant que les deux opérations retournent false ... eh bien, en fait, le code ci-dessus ne renvoie rien, je suis désolé pour l'ambiguïté. Pour clarifier: le comportement dans le second cas dépend de la façon dont le résultat de l'opération est utilisé. Observez comment la priorité des opérateurs entre en jeu ici:
var_dump(true and false || false); // bool(false)
$a = true and false || false; var_dump($a); // bool(true)
La raison pour laquelle $a === true
est dû au fait que l'opérateur d'affectation a la priorité sur tout opérateur logique, comme cela a déjà été très bien expliqué dans d'autres réponses.
Voici un petit exemple de compteur:
$a = true;
$b = true;
$c = $a & $b;
var_dump(true === $c);
sortie:
bool(false)
Je dirais que ce type de faute de frappe est beaucoup plus susceptible de causer des problèmes insidieux (à peu près de la même manière que =
vs ==
) et est beaucoup moins susceptible d'être remarqué que les fautes de frappe adn
/ro
qui signaleront comme des erreurs de syntaxe. Je trouve aussi et/ou est beaucoup plus facile à lire. FWIW, la plupart des PHP frameworks qui expriment une préférence (la plupart ne le spécifient pas) et/ou. De plus, je n'ai jamais rencontré de cas réel, sans solution artificielle, où cela aurait eu de l'importance.