@2024_Hello_World

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

【PHP】【初心者】比較演算子XORの使い方について

解決したいこと

PHPで思ったような挙動になりません。
下記のコードで出力が「失敗」にならないのはなぜですか。
if文の条件式にてXORの左辺true,右辺falseになるので、ifの処理「成功」が出力されると思いましたが、else文の「失敗」が出力するのはなぜでしょうか?

    <?php
    $a=5;
    $b=10;
    if(!$a>=10 XOR !$b>=6){
        echo "成功";
    }else{
        echo "失敗";
    }
    ?>
0 likes

3Answer

以下、AIに聞いてみた結果です。

問題のコードで予想外の挙動が発生しているのは、if文内の条件式がPHPの演算子の優先順位に従って解釈されているためです。!$a>=10という部分が意図した動作をしていないのが原因です。

PHP において、!(論理否定)演算子は比較演算子(この場合は >=)よりも優先順位が高いです。したがって、!$a>=10は、(!$a)>=10として解釈されます。つまり、先に!$a($aがfalseならtrue、それ以外ならfalseを返す)の評価が行われ、その結果が10と比較されようとします。

コードを段階的に分解してみましょう:

$a=5; なので、$aはtrueとして扱われます(PHPでは0以外の数値はtrueとして扱われます)。!$aはfalseです。

!$a>=10は、(!$a)>=10、つまりfalse>=10となります。PHPではfalseは数値として比較される場合、0として扱われます。したがって、この式は0>=10と同等と見なされ、結果はfalseになります。

同様に、!$b>=6も(!$b)>=6、つまりfalse>=6、これも0>=6と同等で、結果はfalseになります。

最終的に、if(false XOR false)となります。XOR(排他的論理和)は、両方のオペランドが異なる場合にのみtrueを返しますが、この場合は両方ともfalseなので、結果はfalseとなります。そのため、elseブロックが実行され、「失敗」と出力されます。

本来の意図に沿ったコードに修正する場合は、条件を明示的に括弧を使用して区切ります。コードの意図が$a<10 XOR $b<6だった場合、次のように書くことができます:

<?php
$a = 5;
$b = 10;
if (($a < 10) XOR ($b < 6)) {
    echo "成功";
} else {
    echo "失敗";
}
?>

この場合、($a < 10) は true、($b < 6) は false と評価されますので、true XOR false となり、ifブロックの「成功」が出力されます

2Like

優先順位も考慮する必要があったのですね。
わかりやすく参考になりました!
ご回答いただきありがとうございました!

1Like

Comments

  1. 質問者の意図したように記述したいならば、以下のようになるかと。

    if(!($a>=10) XOR !($b>=6))
    

Your answer might help someone💌