web-dev-qa-db-ja.com

演算子としての 'AND' vs '&&'

私は開発者が&&||の代わりにANDORを使うことに決めたコードベースを持っています。

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

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

276
ts.

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)
622
Powerlord

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

42
adamJLev

安全のために、私は常に比較を括弧でくくってそれらを省きます。そのように、私はオペレータの優先順位に頼る必要はありません:

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

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

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

文字列を返します。

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

booleanを返します。

9
arviman

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
8
Justinas

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

私がコードを書いている特定のコードベースのためのコーディング標準がどの演算子が使われるべきであるかを指定するならば、私は間違いなくそれを使うでしょう。そうでなければ、コードを使用するように指示します(通常は簡単に回避できます)。それを使用します。そうでなければ、おそらく&&です。

'and'は '&&'より読みやすくなっていますか?

読みやすくなっていますか答えははいといいえです。オペレータの周りのコードや実際にそれを読んでいる人を含む多くの要因によります。

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

はい。 ||については 論理演算子~については ビット単位演算子 を参照してください。

1
salathe

“と” - “ &&” - “&”の違いを説明しましょう。

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

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

1回の操作でそれらを混在させると、場合によっては予期しない結果が生じる可能性があります&&を常に使用することをお勧めしますが、それがあなたの選択です。


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

(14と7)を実行した場合の例は6になります。

7   = 0111
14  = 1110
------------
    = 0110 == 6
1
Mahmoud Zalt

使用している言語にもよりますが、一般的にPythonのようなandorが代わりに使用され、&&||が存在しない場合を除いて、andorより&&||を使用することをお勧めします。

0
Aryan Beezadhur

=代入操作なしで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, falsetrue, true, falseの場合で異なります。詳しい例については、 https://ideone.com/lsqovs を参照してください。

0
Ken

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

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

0
nuqqsa

これはちょっと反例です。

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

出力:

bool(false)

私は、この種のタイプミスが(= vs ==と同じように)潜行性の問題を引き起こす可能性がはるかに高く、構文エラーとしてフラグを立てるadn/roのタイプミスよりもはるかに気付かれる可能性が低いと思います。また、私は見つけたり、読みやすくしたりしています。 FWIW、好みを表現するほとんどのPHPフレームワークは、ほとんどの場合はそうではないと指定します。私はそれが問題になるであろう本当の、人為的でないケースに出会うこともありませんでした。

0
Synchro