私は開発者が&&
と||
の代わりにAND
とOR
を使うことに決めたコードベースを持っています。
私は演算子の優先順位に違いがあることを知っています(&&
はand
より先に行きます)、しかし与えられたフレームワーク(正確には PrestaShop )ではそれは明らかに理由ではありません。
どのバージョンを使用していますかand
は&&
より読みやすくなっていますか?それとも違いはありませんか?
AND
およびOR
を使用すると、最終的には次のような原因で起動します。
$this_one = true;
$that = false;
$truthiness = $this_one and $that;
$truthiness
が何に等しいのか推測したいですか?
false
... bzzztと言った場合は、申し訳ありませんが、間違っています。
上記の$truthiness
の値はtrue
です。どうして? =
はand
よりも 優先順位が高い を持ちます。暗黙の順序を示すために括弧を追加すると、これがより明確になります。
($truthiness = $this_one) and $that
最初のコード例でand
の代わりに&&
を使用した場合は、期待どおりに機能し、false
になります。
以下のコメントで説明されているように、括弧は=
よりも優先順位が高いため、これは正しい値を取得するためにも機能します。
$truthiness = ($this_one and $that)
それがどのように使われているかによって、それは必要かもしれないし、さらには便利かもしれません。 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;
しかし、ほとんどの場合、私が@SarfrazのようなCodeIgniterフレームワークで見たことがあるたびに、これは開発者の好みのもののように思えます。
安全のために、私は常に比較を括弧でくくってそれらを省きます。そのように、私はオペレータの優先順位に頼る必要はありません:
if(
((i==0) && (b==2))
||
((c==3) && !(f==5))
)
優先順位は&&とandの間で異なります(&&の方がandよりも優先順位が高いため、三項演算子と組み合わせると混乱が生じます)。例えば、
$predA && $predB ? "foo" : "bar"
文字列を返します。
$predA and $predB ? "foo" : "bar"
booleanを返します。
and
は=
より優先順位が低いため、条件代入に使用できます。
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
どのバージョンを使っていますか?
私がコードを書いている特定のコードベースのためのコーディング標準がどの演算子が使われるべきであるかを指定するならば、私は間違いなくそれを使うでしょう。そうでなければ、コードがを使用するように指示します(通常は簡単に回避できます)。それを使用します。そうでなければ、おそらく&&
です。
'and'は '&&'より読みやすくなっていますか?
読みやすくなっていますか。答えははいといいえです。オペレータの周りのコードや実際にそれを読んでいる人を含む多くの要因によります。
|| 〜違いはありますか?
“と” - “ &&” - “&”の違いを説明しましょう。
"&&"と "and"はどちらも論理AND演算で、同じことをしますが、演算子の優先順位が異なります。
演算子の優先順位(優先順位)は、2つの式をどの程度「強く」結合するかを指定します。たとえば、式1 + 5 * 3では、乗算( "*")演算子の方が加算( "+")演算子よりも優先順位が高いため、答えは16ではなく18です。
1回の操作でそれらを混在させると、場合によっては予期しない結果が生じる可能性があります&&を常に使用することをお勧めしますが、それがあなたの選択です。
一方、 "&"はビット単位のAND演算です。整数値内の特定のビットの評価と操作に使用されます。
(14と7)を実行した場合の例は6になります。
7 = 0111
14 = 1110
------------
= 0110 == 6
使用している言語にもよりますが、一般的にPythonのような
and
とor
が代わりに使用され、&&
と||
が存在しない場合を除いて、and
とor
より&&
と||
を使用することをお勧めします。
=
代入操作なしでif
ステートメントを使用するもう1つの良い例です。
if (true || true && false); // is the same as:
if (true || (true && false)); // TRUE
そして
if (true || true AND false); // is the same as:
if ((true || true) && false); // FALSE
なぜならAND
は優先順位が低く、したがって||
は優先順位が高いからです。
これらはtrue, false, false
とtrue, true, false
の場合で異なります。詳しい例については、 https://ideone.com/lsqovs を参照してください。
私はそれが好みの問題だと思いますが、(誤って)それらを混ぜ合わせるといくつかの望ましくない動作を引き起こすかもしれません:
true && false || false; // returns false
true and false || false; // returns true
したがって、&&と||を使う彼らは最高の優先順位を持っているので安全です。読みやすさに関しては、これらの演算子は十分に普遍的であると私は思います。
UPDATE:両方の操作がfalseを返すというコメントについて...実際、上記のコードは何も返しません。あいまいさを残念に思います。明確にするために:2番目のケースでの振る舞いは操作の結果がどのように使われるかに依存します。演算子の優先順位がどのように作用するのかを観察してください。
var_dump(true and false || false); // bool(false)
$a = true and false || false; var_dump($a); // bool(true)
$a === true
は、他の回答で既に非常によく説明されているように、代入演算子がどの論理演算子よりも優先されるためです。
これはちょっと反例です。
$a = true;
$b = true;
$c = $a & $b;
var_dump(true === $c);
出力:
bool(false)
私は、この種のタイプミスが(=
vs ==
と同じように)潜行性の問題を引き起こす可能性がはるかに高く、構文エラーとしてフラグを立てるadn
/ro
のタイプミスよりもはるかに気付かれる可能性が低いと思います。また、私は見つけたり、読みやすくしたりしています。 FWIW、好みを表現するほとんどのPHPフレームワークは、ほとんどの場合はそうではないと指定します。私はそれが問題になるであろう本当の、人為的でないケースに出会うこともありませんでした。