開発者がAND
andのOR
代わりに&&
and を使用することを決定したコードベースがあり||
ます。
演算子の優先順位(&&
前に行くand
)に違いがあることを知っていますが、与えられたフレームワーク(正確にはPrestaShop)では、それは明らかに理由ではありません。
どのバージョンを使用していますか?であるand
よりもより読みやすいですか&&
?または違いはありませんか?
開発者がAND
andのOR
代わりに&&
and を使用することを決定したコードベースがあり||
ます。
演算子の優先順位(&&
前に行くand
)に違いがあることを知っていますが、与えられたフレームワーク(正確にはPrestaShop)では、それは明らかに理由ではありません。
どのバージョンを使用していますか?であるand
よりもより読みやすいですか&&
?または違いはありませんか?
回答:
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)
and
or
一度だけ廃止されます。彼らはまったく同じものだと思っている人が多すぎて、ここでの回答はより多くの声です。
$foo and bar()
ifステートメントの便利なショートカットであるなどの構成を可能にします。予期しない動作(不適切なドキュメンテーションから、またはそれを読んでいないこと)が、PHPの使用について話していないものを使用しない理由である場合。
それがどのように使用されているかに応じて、それは必要であり、さらに便利かもしれません。 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 ($f = false or true) $f = true;
結果は$f
最終的に真になります。
$f
falseが割り当てられますが、条件はtrueと評価されるため、$f
上書きされます。条件がfalseと評価された場合、$f
どちらの方法でも上書きされることはありません。
and
以上&&
、and
作品が唯一のいくつかの状況とで期待どおり&&
のすべてで期待どおりに作品を状況。
安全のため、比較は常に括弧で囲み、間隔を空けています。そうすれば、演算子の優先順位に依存する必要がなくなります。
if(
((i==0) && (b==2))
||
((c==3) && !(f==5))
)
「and」-「&&」-「&」の違いについて説明します。
「&&」と「and」はどちらも論理AND演算であり、同じことを行いますが、演算子の優先順位が異なります。
演算子の優先順位(優先度)は、2つの式をどのように「緊密に」結合するかを指定します。たとえば、式1 + 5 * 3では、乗算( "*")演算子は加算( "+")演算子よりも優先順位が高いため、答えは18ではなく16です。
それらを1つの操作で一緒に混合すると、予期しない結果が生じる場合 があります。常に&&を使用することをお勧めしますが、それはあなたの選択です。
一方、「&」はビット単位のAND演算です。整数値内の特定のビットの評価と操作に使用されます。
例(14&7)の場合、結果は6になります。
7 = 0111
14 = 1110
------------
= 0110 == 6
どのバージョンを使用していますか?
私がコードを記述している特定のコードベースのコーディング標準が、どの演算子を使用すべきかを指定している場合、私は間違いなくそれを使用します。そうでない場合、コードはどちらを使用すべきかを指示します(多くの場合、簡単に回避できます)、それを使用します。そうでなければ、おそらく &&
。
「&」は「&&」より読みやすいですか?
それは、より読みやすいあなたに。答えは「はい」と「いいえ」で、オペレーターの周りのコードや実際にそれを読んでいる人など、多くの要因によって異なります。
|| 〜違いがありますか?
私はそれが好みの問題だと思いますが、(誤って)それらを混ぜ合わせると、いくつかの望ましくない動作を引き起こす可能性があります:
true && false || false; // returns false
true and false || false; // returns true
したがって、&&と||を使用します 優先順位が最も高いため、より安全です。読みやすさに関しては、これらの演算子は十分に普遍的だと思います。
更新:両方の操作が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
typos よりもはるかに気づかれにくいと思います。私も見つけて、読みやすくなっています。FWIW、プリファレンスを表現するほとんどのPHPフレームワーク(ほとんどは指定しない)および/または指定します。私はまた、それが重要であった実際の不自然なケースに遭遇したことはありません。
代入演算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を参照してください。
~
はビット単位のNOT演算子であり、論理ではないことに注意してください。;-)