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 y a 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? Est and
plus lisible que &&
? Ou n'y a-t-il aucune différence?
~
s'agit de l'opérateur NOT au niveau du bit et non de la logique. ;-)Réponses:
Si vous utilisez
AND
etOR
, vous finirez par vous faire tromper par quelque chose comme ceci:Vous voulez deviner ce qui
$truthiness
est égal?Si vous avez dit
false
... bzzzt, désolé, faux!$truthiness
ci-dessus a la valeurtrue
. Pourquoi?=
a une priorité plus élevée queand
. L'ajout de parenthèses pour montrer l'ordre implicite rend cela plus clair:Si vous l'avez utilisé à la
&&
place deand
dans le premier exemple de code, cela fonctionnerait comme prévu et le seraitfalse
.Comme indiqué dans les commentaires ci-dessous, cela fonctionne également pour obtenir la valeur correcte, car les parenthèses ont une priorité plus élevée que
=
:la source
and
or
une fois pour toutes. J'ai vu trop de gens penser qu'ils étaient exactement la même chose et les réponses ici sont plus de témoignages.$foo and bar()
, qui sont de bons raccourcis pour les instructions if. Si un comportement inattendu (d'une mauvaise documentation, ou de ne pas le lire) était une raison de ne pas utiliser quelque chose, nous ne parlerions pas du tout de l'utilisation de PHP.Selon la façon dont il est utilisé, il peut être nécessaire et même pratique. http://php.net/manual/en/language.operators.logical.php
Mais dans la plupart des cas, cela ressemble plus à un goût de développeur, comme chaque occurrence de cela que j'ai vue dans le cadre de CodeIgniter comme @Sarfraz l'a mentionné.
la source
if ($f = false or true) $f = true;
- le résultat serait que$f
cela devient vrai à la fin, car l'expression s'évalue comme vraie dans l'ensemble.$f
false est affectée - mais la condition est évaluée à true, elle$f
est donc remplacée. Si la condition est évaluée à faux,$f
elle ne sera jamais remplacée de toute façon.and
plus&&
, oùand
fonctionne comme prévu que dans certaines situations et&&
fonctionne comme prévu dans tous les situations.Pour des raisons de sécurité, je garde toujours entre parenthèses mes comparaisons et je les espace. De cette façon, je n'ai pas à me fier à la priorité des opérateurs:
la source
La priorité diffère entre && et et (&& a une priorité plus élevée que and), ce qui cause de la confusion lorsqu'il est combiné avec un opérateur ternaire. Par exemple,
renverra une chaîne alors que
renverra un booléen .
la source
Depuis
and
a une priorité inférieure à celle que=
vous pouvez utiliser dans l'affectation de condition:la source
"&&" et "et" sont tous deux des opérations ET 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 ensemble. 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 ensemble en une seule opération pourrait vous donner des résultats inattendus dans certains cas, je recommande toujours d'utiliser &&, mais c'est votre choix.
D'un autre côté, "&" est une opération ET au niveau du bit . Il est utilisé pour l'évaluation et la manipulation de bits spécifiques dans la valeur entière.
Par exemple, si vous le faites (14 et 7), le résultat serait 6.
la source
Si les normes de codage pour la base de code particulière pour laquelle j'écris du code spécifient l'opérateur à utiliser, je vais certainement l' utiliser. Sinon, et le code dicte qui doit être utilisé (pas souvent, peut être facilement contourné) alors je vais l'utiliser. Sinon, probablement
&&
.Est-il plus lisible pour vous ? La réponse est oui et non en fonction de nombreux facteurs dont le code autour de l'opérateur et même de la personne qui le lit!
Oui. Voir les opérateurs logiques pour
||
et les opérateurs au niveau du bit pour~
.la source
Je suppose que c'est une question de goût, bien que (à tort) les mélanger puisse provoquer des comportements indésirables:
Par conséquent, en utilisant && et || est plus sûr car ils ont la plus haute priorité. En ce qui concerne la lisibilité, je dirais que ces opérateurs sont assez universels.
MISE À JOUR : À 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:
La raison en
$a === true
est que l'opérateur d'affectation a priorité sur tout opérateur logique, comme cela est déjà très bien expliqué dans d'autres réponses.la source
Voici un petit contre-exemple:
production:
Je dirais que ce type de faute de frappe est beaucoup plus susceptible de causer des problèmes insidieux (de la même manière que
=
vs==
) et est beaucoup moins susceptible d'être remarqué queadn
/ro
typos qui signalera comme des erreurs de syntaxe. Je trouve également et / ou est beaucoup plus facile à lire. FWIW, la plupart des frameworks PHP qui expriment une préférence (la plupart ne le font pas) spécifient et / ou. Je n'ai également jamais rencontré de cas réel et non artificiel où cela aurait eu de l'importance.la source
Un autre bel exemple utilisant des
if
instructions sans=
opérations d'affectation.et
car
AND
a une priorité inférieure et donc||
une priorité plus élevée.Celles-ci sont différentes dans les cas de
true, false, false
ettrue, true, false
. Voir https://ideone.com/lsqovs pour un exemple détaillé.la source