web-dev-qa-db-fra.com

'AND' vs '&&' en tant qu'opérateur

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?

263
ts.

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)
602
Powerlord

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é.

40
adamJLev

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
9
Justinas

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)) 
  )
9
Captain Kenpachi

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 .

8
arviman

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 ~.

1
salathe

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
1
Mahmoud Zalt

En fonction de la langue que vous utilisez, il est généralement préférable d'utiliser && et || plutôt que and et or, sauf dans des langues telles que Python, où and et or sont utilisés et où && et || n'existent pas.

0
Aryan Beezadhur

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é.

0
Ken

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.

0
nuqqsa

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.

0
Synchro