'ET' 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 y a une différence dans la préséance des opérateurs ( && va avant and ), mais avec le cadre donné ( PrestaShop pour être précis) il est clair que ce n'est pas une raison.

quelle version utilisez-vous? Est-ce que and est plus lisible que && ? Ou est il n'y pas de différence?

253
demandé sur Peter Mortensen 2010-05-10 18:20:14
la source

11 ответов

si vous utilisez AND et OR , vous finirez par vous faire trébucher par quelque chose comme ça:

$this_one = true;
$that = false;

$truthiness = $this_one and $that;

devinez ce que $truthiness signifie?

si vous avez dit false ... bzzzt, désolé, faux!

$truthiness ci-dessus a la valeur true . Pourquoi? = a priorité plus élevée que and . L'ajout de parenthèses pour montrer l' ordre implicite rend cela 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 expliqué dans les commentaires ci-dessous, cela fonctionne aussi pour obtenir la valeur correcte, car les parenthèses ont une plus haute priorité que = :

$truthiness = ($this_one and $that)
585
répondu Powerlord 2018-06-15 12:08:46
la source

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

// "||" 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, il semble plus comme une chose de goût de développeur, comme chaque occurrence de ce que j'ai vu dans le cadre CodeIgniter comme @Sarfraz a mentionné.

39
répondu adamJLev 2011-05-24 19:37:56
la source

puisque and a une priorité inférieure à = vous pouvez l'utiliser dans l'assignation de condition:

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
répondu Justinas 2016-01-08 10:58:26
la source

pour des raisons de sécurité, je mets toujours entre parenthèses mes comparaisons et les Espace. De cette façon, je n'ai pas à me fier à l'opérateur priorité:

if( 
    ((i==0) && (b==2)) 
    || 
    ((c==3) && !(f==5)) 
  )
8
répondu Captain Kenpachi 2012-11-13 18:06:41
la source

la préséance diffère entre & & & et et (&&a une préséance plus élevée que et), ce qui cause de la confusion lorsqu'il est combiné avec un opérateur ternaire. Par exemple,

$predA && $predB ? "foo" : "bar"

retournera une chaîne tandis que

$predA and $predB ? "foo" : "bar"

retournera un booléen .

7
répondu arviman 2012-08-08 13:04:09
la source

quelle version utilisez-vous?

si les normes de codage de la base de données particulière pour laquelle j'écris le code spécifient quel opérateur doit être utilisé, je vais certainement utiliser cela. Si non, et le code dicte qui devrait être utilisé (pas souvent, peut être facilement travaillé autour) alors je vais utiliser cela. Autrement, probablement && .

Est " et "plus lisible que"&&'?

est-il plus lisible pour vous . La réponse est oui et non en fonction de nombreux facteurs, y compris le code autour de l'opérateur et en fait la personne qui le lit!

/ / il y a une différence?

Oui. Voir opérateurs logiques pour || et opérateurs bitwise pour ~ .

1
répondu salathe 2010-05-10 18:52:53
la source

Laissez-moi vous expliquer la différence entre "et" - "&&" - "&".

"&&" et "et" les deux sont des logique ET des opérations et ils font la même chose, mais la priorité de l'opérateur est différent.

la priorité (priority) 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 parce que la multiplication ("*") a une priorité plus élevée que les plus ("+").

les mélanger en une seule opération, pourrait vous donner des résultats inattendus dans certains cas Je recommande toujours l'utilisation de&&, mais c'est votre choix.


d'autre part "&" est un au niveau du bit ET de l'opération . Il est utilisé pour l'évaluation et la manipulation de bits spécifiques à l'intérieur de la valeur entière.

exemple si vous faites (14 & 7) le résultat serait 6.

7   = 0111
14  = 1110
------------
    = 0110 == 6
1
répondu Mahmoud Zalt 2017-11-23 02:37:28
la source

je suppose que c'est une question de goût, bien que le mélange (par erreur) pourrait causer des comportements indésirables:

true && false || false; // returns false

true and false || false; // returns true

donc, utiliser && 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 universel.

mise à jour : à propos des commentaires disant que les deux opérations sont fausses ... en fait, le code ci-dessus ne renvoie rien. 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 préséance 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 parce que l'opérateur de tâche a priorité sur n'importe quel opérateur logique, comme déjà très bien expliqué dans d'autres réponses.

0
répondu nuqqsa 2014-05-26 02:23:59
la source

voici un petit contre-exemple:

$a = true;
$b = true;
$c = $a & $b;
var_dump(true === $c);

sortie:

bool(false)

je dirais que ce genre de typographie est beaucoup plus susceptible de causer des problèmes insidieux (à peu près de la même façon que = vs == ) et est beaucoup moins susceptible d'être remarqué que adn / ro typographies qui marqueront comme des erreurs de syntaxe. Je trouve aussi et/ou est beaucoup plus facile à lire. FWIW, la plupart des cadres PHP qui expriment une préférence (la plupart ne spécifient pas) et/ou. Je n'ai jamais rencontré une vraie affaire non-inventée où ça aurait eu de l'importance.

0
répondu Synchro 2017-06-26 00:00:01
la source

Selon 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 langages comme Python, où and et or sont utilisés à la place et && et || n'existent pas.

0
répondu Aryan Beezadhur 2018-01-01 17:25:23
la source

un autre bel exemple utilisant les instructions if sans les opérations d'affectation = .

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.

elles sont différentes dans les cas de true, false, false et true, true, false . Voir https://ideone.com/lsqovs pour en élaborer exemple.

0
répondu Ken 2018-07-19 15:56:11
la source

Autres questions sur php coding-style operators