0
<?php
function neglogic($x,$y)
{
    if ($x<0.0 &&  $y>=0.0 )
    {
        $p1=("1");
    }
    elseif ($x<<0.0 &&  $y<<0.0 )
    {
        $p1=($x/$y);
    }
    if ($x==0.0 &&  $y>=0.0 )
    {
        $p1=("1");
    }
    elseif ($x==0.0 &&  $y<0.0 )
    {
        $p1=("0.05");
    }
    if ($x>0.0 && $y <=0.0)    
    { 
        $p1=("0.20");
    }
    elseif($x>0.0 && $y >0.0)
    {
        $q1=($x-$y);

        if ($q1>=0)
        {
            $p1=("0.20");
        }
        if ($q1<0)
        {
            $p1=("1.0");
        }
    }
    return $p1;
}
?>

これは問題なく動作するスクリプトですが、(-1 から -0.001) の間の値では失敗することに気付きました。

以下をお試しください 2 番目 (-.8,-2) で $pq が定義されていないと言って失敗します。

最初に $p1 を定義できることはわかっていますが、2 番目の数字で失敗する理由を知りたいです。

<?php
echo neglogic(-8,-2);
?>
<?php
echo neglogic(-0.8,-2);
?>
4

2 に答える 2

2

elseif ($x<<0.0 && $y<<0.0 )

"<<" は、PHP ではより小さいという意味ではありません。左シフトという意味です。

左に0桁シフトしたということですか?または、より少ないテストを意味しましたか<

http://www.php.net/manual/en/language.operators.bitwise.php

がコード内にある場合、"<<"意図しない動作を引き起こす有効なコードです。つまりバグです。左シフト 0 ビットは何もしないので、if は if ($x && $y) になり、ブール値に変換すると x と y の両方が true の場合に true になります。PHP ドキュメントによると、0 およびさまざまな同様の値は false であり、それ以外はすべて true です。そのため、バグに続く句は、x と y が存在し、ゼロ以外であるか、両方とも「真」である限り実行されます。特に、if 句は、x または y が正の場合に実行される可能性があります。これは、正の値が true であるためです。これは、0 未満をテストしていると思った場合の意図しない動作です。

http://www.php.net/manual/en/language.types.boolean.php#language.types.boolean.casting

http://www.php.net/manual/en/language.types.boolean.php#language.types.boolean.casting

于 2013-04-29T23:01:24.063 に答える
1

このコードには非常に奇妙なスタイルが数多くありますが、最も飛び出すのは次のとおりです。

 elseif ($x<<0.0 &&  $y<<0.0 )

<<これはビットごとの左シフト演算子であり、シフトとして 0 が渡されているため、何もしません。

<より少ない比較のために、ということですか?

于 2013-04-29T23:01:16.093 に答える