328

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

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

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

4

10 に答える 10

702

と を使用するANDOR、最終的には次のようなことにつまずいてしまいます。

$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)
于 2010-05-10T14:48:40.900 に答える
46

使い方によっては、必要で便利な場合もあります。 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 フレームワークで見たこれのすべての発生のように、開発者の好みのように思えます。

于 2010-05-10T14:27:11.057 に答える
14

条件割り当てで使用できる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
于 2016-01-08T07:58:26.413 に答える
13

安全のために、私は常に比較対象を括弧で囲み、スペースを空けています。そうすれば、演算子の優先順位に頼る必要がなくなります。

if( 
    ((i==0) && (b==2)) 
    || 
    ((c==3) && !(f==5)) 
  )
于 2012-11-13T14:06:41.083 に答える
12

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

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

文字列を返しますが、

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

ブール値を返します。

于 2012-08-08T08:59:05.740 に答える
1

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

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

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

それはあなたにとってより読みやすいですか。オペレーターの周りのコードや実際にそれを読んでいる人を含む多くの要因に応じて、答えはイエスかノーかで決まります!

|| ~違いはありますか?

はい。の論理演算子||および のビット演算子を参照してください~

于 2010-05-10T14:52:53.080 に答える
1

代入操作のifないステートメントを使用した別の良い例。=

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を参照してください。

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

于 2010-05-10T14:32:57.610 に答える