'AND' vs '&&' as operator
I have a codebase where developers decided to use
OR instead of
I know that there is a difference in operators' precedence (
&& goes before
and), but with the given framework (PrestaShop to be precise) it is clearly not a reason.
Which version are you using? Is
and more readable than
&&? Or is there no difference?
If you use
OR, you'll eventually get tripped up by something like this:
$this_one = true; $that = false; $truthiness = $this_one and $that;
Want to guess what
If you said
false... bzzzt, sorry, wrong!
$truthiness above has the value
= has a higher precedence than
and. The addition of parentheses to show the implicit order makes this clearer:
($truthiness = $this_one) and $that
If you used
&& instead of
and in the first code example, it would work as expected and be
As discussed in the comments below, this also works to get the correct value, as parentheses have higher precedence than
$truthiness = ($this_one and $that)
Depending on how it's being used, it might be necessary and even handy. 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;
But in most cases it seems like more of a developer taste thing, like every occurrence of this that I've seen in CodeIgniter framework like @Sarfraz has mentioned.
For safety, I always parenthesise my comparisons and space them out. That way, I don't have to rely on operator precedence:
if( ((i==0) && (b==2)) || ((c==3) && !(f==5)) )
Precedence differs between && and and (&& has higher precedence than and), something that causes confusion when combined with a ternary operator. For instance,
$predA && $predB ? "foo" : "bar"
will return a string whereas
$predA and $predB ? "foo" : "bar"
will return a boolean.
and has lower precedence than
= you can use it in condition assignment:
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