開発者がANDandのOR代わりに&&and を使用することを決定したコードベースがあり||ます。
演算子の優先順位(&&前に行くand)に違いがあることを知っていますが、与えられたフレームワーク(正確にはPrestaShop)では、それは明らかに理由ではありません。
どのバージョンを使用していますか?であるandよりもより読みやすいですか&&?または違いはありませんか?
開発者がANDandのOR代わりに&&and を使用することを決定したコードベースがあり||ます。
演算子の優先順位(&&前に行くand)に違いがあることを知っていますが、与えられたフレームワーク(正確にはPrestaShop)では、それは明らかに理由ではありません。
どのバージョンを使用していますか?であるandよりもより読みやすいですか&&?または違いはありませんか?
回答:
ANDand を使用すると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最終的に真になります。
$ffalseが割り当てられますが、条件は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/ rotypos よりもはるかに気づかれにくいと思います。私も見つけて、読みやすくなっています。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演算子であり、論理ではないことに注意してください。;-)