演算子としての「AND」と「&&」


298

開発者がANDandのOR代わりに&&and を使用することを決定したコードベースがあり||ます。

演算子の優先順位(&&前に行くand)に違いがあることを知っていますが、与えられたフレームワーク(正確にはPrestaShop)では、それは明らかに理由ではありません。

どのバージョンを使用していますか?であるandよりもより読みやすいですか&&?または違いはありませんか?


1
これ~はビット単位のNOT演算子であり、論理ではないことに注意してください。;-)
ガンボ

2
はい、知っています。悪い習慣 :) 。PHPには「and」、「or」、「xor」があることは少し奇妙ですが、「not」はありませんね。
ts。

1
@ts:ここでの正解はR. Bemroseが提供するものであるstackoverflow.com/questions/2803321/and-vs-as-operator/...
マルコDemaio

4
!は論理
否定

2
@chiliNUT正解です。当時は理にかなっていたに違いありません。この時点で、潜んでいる不正解が罰せられたようです:)
doublejosh '28

回答:


664

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)

135
+1:これは、PHPのドキュメントで大きく明確にする必要があります。そうしないと、PHPが変更され、これらの演算子に同じ優先順位が与えられるか、and or一度だけ廃止されます。彼らはまったく同じものだと思っている人が多すぎて、ここでの回答はより多くの声です。
Marco Demaio、

11
実際、他の言語(PerlやRubyなど)にも同じ優先順位の違いがあるこれらのバリアントがあるため、PHPで優先順位を等しくすることでこの標準から逸脱することは賢明ではありません(ただし、初心者にとっては不可解です)。多くのPHPアプリケーションの下位互換性は言うまでもありません。
MladenJablanović2012年

23
人々が言語のドキュメントを読むことができないことは、言語の決定を間違っているわけではありません。Mladenが指摘するように、PerlとRubyもこれらの追加の演算子を同じ優先順位で使用します。これは、$foo and bar()ifステートメントの便利なショートカットであるなどの構成を可能にします。予期しない動作(不適切なドキュメンテーションから、またはそれを読んでいないこと)が、PHPの使用について話していないものを使用しない理由である場合。
Altreus 2012

2
私は3分かけて間違った行を見つけました:$ this = true、:(そして$ truthiness =($ thisと$ thatは
どうでしょう

6
私はDmitriyに同意します-ブール評価を括弧で囲むと、コードの意図が明確になります。オペレーターとその機能は現在存在しているため価値があり、他の言語と一貫性があると思います。言語を理解するのはプログラマーの仕事です。
Jon z

43

それがどのように使用されているかに応じて、それは必要であり、さらに便利かもしれません。 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フレームワークで見たすべての発生と同様に、開発者の好みのように思えます。


2
その式がより大きなステートメントの一部である場合、「true」は無視されないことに注意してください。ケースを検討してください。式は全体的に真と評価されるため、if ($f = false or true) $f = true;結果は$f最終的に真になります。
Chris Browne

1
いいえ、後で変数を上書きしただけです。式がまだfalseと評価されている場合は、次の行でtrueで上書きしました。
r3wt 2014年

2
実際、彼は正しかった。まず、$ffalseが割り当てられますが、条件はtrueと評価されるため、$f上書きされます。条件がfalseと評価された場合、$fどちらの方法でも上書きされることはありません。
ahouse101 2014年

開発者が自分の好みに従うべきだと提案するのはばかげています。同じコードを維持しようとしている別の開発者の悪夢を忘れて、コード自体を書いた開発者は、S /彼が好まので書かれた任意のコード内のセマンティックミス作ることになるand以上&&and作品が唯一のいくつかの状況とで期待どおり&&のすべてで期待どおりに作品を状況。
ADTC 2018

13

安全のため、比較は常に括弧で囲み、間隔を空けています。そうすれば、演算子の優先順位に依存する必要がなくなります。

if( 
    ((i==0) && (b==2)) 
    || 
    ((c==3) && !(f==5)) 
  )

29
個人的には、余分な括弧を追加すると、必要なものだけを読むよりも読みにくくなると思います。たとえば、これはもっと読みやすいと思います:if(($ i == 0 && $ b == 2)||($ c == 3 && $ f!= 5))
rooby

4
これは、私が1日見てきた中で最も美しいコードだと思います。よくやった。
rm-vanda 2014

PHPはインタープリター型言語であるため、コードで不要な空白や改行を使用しないと高速に実行されます。コンパイル済み言語で同じことを行うと、コンパイルにかかる時間が長くなりますが、ランタイムには影響しません。私は一度それを行うと違いをマークするつもりはありませんが、php + javascriptを使用するアプリケーション全体で両方とも例のように書きました...ロード時間は確かに長くなります。説明:空白および改行は無視されますが、それらを無視するには、チェックする必要があります。これは、実行時に解釈された言語で、およびコンパイルされた言語でコンパイルするときに発生します。
JoelBonetR

@JoelBonetR php opcacheまたは同様のものを使用している場合、ロード時間に関する懸念は関係ありません。それなしで
運用

@PeloNZなので、とにかくキャッシュされるため、ダーティーで書き込むことができ、更新時にプロジェクト全体がロードされるのにかかる時間はもう1秒だけですよね?クリーンなコードを書くことはあなた自身とあなたのチームメイトにとって、タイミングについての心配はほとんどの人が無視するか、単に知らなかったポイントにすぎませんでした。
JoelBonetR 2018

11

&&andの間で優先順位が異なります(&&はandよりも優先順位が高くなります)。3項演算子と組み合わせると混乱が生じます。例えば、

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

文字列を返します

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

ブール値を返します。


10

は条件割り当てで使用できる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

2

「and」-「&&」-「&」の違いについて説明します。

「&&」と「and」はどちらも論理AND演算であり、同じことを行いますが、演算子の優先順位が異なります。

演算子の優先順位(優先度)は、2つの式をどのように「緊密に」結合するかを指定します。たとえば、式1 + 5 * 3では、乗算( "*")演算子は加算( "+")演算子よりも優先順位が高いため、答えは18ではなく16です。

それらを1つの操作で一緒に混合すると、予期しない結果が生じる場合 があります。常に&&を使用することをお勧めしますが、それはあなたの選択です。


一方、「&」はビット単位のAND演算です。整数値内の特定のビットの評価と操作に使用されます。

例(14&7)の場合、結果は6になります。

7   = 0111
14  = 1110
------------
    = 0110 == 6

1

どのバージョンを使用していますか?

私がコードを記述している特定のコードベースのコーディング標準が、どの演算子を使用すべきかを指定している場合、私は間違いなくそれを使用します。そうでない場合、コードはどちらを使用すべきかを指示します(多くの場合、簡単に回避できます)、それを使用します。そうでなければ、おそらく &&

「&」は「&&」より読みやすいですか?

それは、より読みやすいあなたに。答えは「はい」と「いいえ」で、オペレーターの周りのコードや実際にそれを読んでいる人など、多くの要因によって異なります。

|| 〜違いがありますか?

はい。参照してください。論理演算子のため||ビット演算子のために~


0

私はそれが好みの問題だと思いますが、(誤って)それらを混ぜ合わせると、いくつかの望ましくない動作を引き起こす可能性があります:

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は、他の回答ですでに非常によく説明されているように、代入演算子がどの論理演算子よりも優先されるためです。


16
これは真実ではなく、すべて偽を返します。
ジェイ

0

ここに小さなカウンターの例があります:

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

出力:

bool(false)

この種のタイプミスは、(=vs とほぼ同じように==)陰湿な問題を引き起こす可能性がはるかに高く、構文エラーとしてフラグを付けるadn/ rotypos よりもはるかに気づかれにくいと思います。私も見つけて、読みやすくなっています。FWIW、プリファレンスを表現するほとんどのPHPフレームワーク(ほとんどは指定しない)および/または指定します。私はまた、それが重要であった実際の不自然なケースに遭遇したことはありません。


0

代入演算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を参照してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.