web-dev-qa-db-ja.com

論理演算子、||またはOR?

ORの場合、||を使用したほうがorよりも優れていた(またはその逆)論理演算子に関してしばらく読んだことを覚えています。

プロジェクトに戻ってきたときにこれを使用しなければなりませんでしたが、どの演算子が推奨されたのか、それが本当だったのか覚えていません。

どちらが良いですか?

95
drpcken

「より良い」ものはありませんが、より一般的なものは||です。異なる precedence があり、||は通常のように機能します。

参照: 論理演算子そこから次の例を取ります ):

// 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;
129
Felix Kling

それらはさまざまな目的に使用され、実際には演算子の優先順位が異なります。 &&および||演算子はブール条件を対象としていますが、andおよびorは制御フローを対象としています。

たとえば、次はブール条件です。

if ($foo == $bar && $baz != $quxx) {

これは制御フローとは異なります。

doSomething() or die();
40

それぞれの違い|| and OR and && and AND is operator precedence

$bool = FALSE || TRUE;

  • ($bool = (FALSE || TRUE))と解釈されます
  • $boolの値はTRUEです

$bool = FALSE OR TRUE;

  • (($bool = FALSE) OR TRUE)と解釈されます
  • $boolの値はFALSEです

$bool = TRUE && FALSE;

  • ($bool = (TRUE && FALSE))と解釈されます
  • $boolの値はFALSEです

$bool = TRUE AND FALSE;

  • (($bool = TRUE) AND FALSE)と解釈されます
  • $boolの値はTRUEです
18
John Slegers

ソース: http://bit.ly/1hxDmVR

論理演算子を使用するためのサンプルコードを次に示します。

<html>

<head>
<title>Logical</title>
</head>
<body>
<?php
$a=10;
$b=20;
if($a>$b)
{
    echo " A is Greater";
}
elseif($a<$b)
{
    echo " A is lesser";
}
else
{
     echo "A and B are equal";
}
?>
<?php
    $c=30;
    $d=40;
   //if(($a<$c)AND($b<$d))
   if(($a<$c)&&($b<$d))
   {
       echo "A and B are larger";
   }
   if(isset($d))
       $d=100;
   echo $d;
   unset($d);
?>
<?php
    $var1=2;
    switch($var1)
    {
        case 1:echo "var1 is 1";
               break;
        case 2:echo "var1 is 2";
               break;
        case 3:echo "var1 is 3";
               break;
        default:echo "var1 is unknown";
    }
?>
</body>
</html>
5
improgrammer

私はそれが古いトピックであることを知っていますが、それでもです。私は職場でデバッグしているコードで問題に遭遇したばかりで、おそらく誰かが同様の問題を抱えている可能性があります...

コードは次のように見えるとしましょう:

$positions = $this->positions() || [];

(javascriptなどに慣れているように)$ this-> positions()がfalseまたはnullを返す場合、$ positionsは空の配列になると予想されます。しかし、そうではありません。値は、$ this-> positions()が返すものに応じてTRUEまたはFALSEになります。

$ this-> positions()または空の配列の値を取得する必要がある場合は、次を使用する必要があります。

$positions = $this->positions() or [];

編集:

上記の例は意図したとおりに動作しませんが、真実は||orが同じではないということです...これを試してください:

<?php

function returnEmpty()
{
  //return "string";
  //return [1];
  return null;
}

$first = returnEmpty() || [];
$second = returnEmpty() or [];
$third = returnEmpty() ?: [];

var_dump($first);
var_dump($second);
var_dump($third);
echo "\n";

これが結果です:

bool(false)
NULL
array(0) {
}

したがって、実際に3番目のオプション?:は、戻り値または空の配列を設定する場合の正しいソリューションです。

$positions = $this->positions() ?: [];

PHP 7.2.1でテスト済み

1
Zdeněk

悪いことも良いこともありません。演算子の優先順位に依存します。 ||orよりも優先度が高いため、||が主に使用されます。

0
Nishu Tayal

あるものが別のものより本質的に優れているとは思わないが、||にこだわることをお勧めする。これはほとんどの言語でデフォルトであるためです。

編集:他の人が指摘したように、実際には2つの間に違いがあります。

0
exahex