【问题标题】:Operator precedence issue in Perl and PHPPerl 和 PHP 中的运算符优先级问题
【发布时间】:2011-10-19 02:55:44
【问题描述】:

PHP:

$a = 2;
$b = 3;
if($b=1 && $a=5)
{
   $a++;
   $b++;
}
echo $a.'-'.$b;


$a = 2;
$b = 3;
if($a=5 and $b=1)
{
   $a++;
   $b++;
}
echo $a.'-'.$b;

输出6-16-2。我看不懂这里的1

Perl:

$a = 2;
$b = 3;
if($b=1 && $a=5)
{
     $a++;                                                                            
     $b++;
}
print $a.'-'.$b;


$a = 2;
$b = 3;
if($a=5 and $b=1)
{
    $a++;
    $b++;
}
print $a.'-'.$b;

输出6-66-2,这里第二个6看不懂。

有人知道原因吗?

其实我知道&&的优先级比and要高,但是事先知道这个我还是有疑问的。

更新

现在我了解了 PHP 的,Perl 的呢?

【问题讨论】:

    标签: php perl operator-precedence


    【解决方案1】:

    关于 Perl:

    与 PHP(但与 Python、JavaScript 等)不同,布尔运算符不返回布尔值,但 使表达式为真(或最后一个值) 的值决定了最终结果表达式 (source)。

    $b=1 && $a=5
    

    被评估为

    $b = (1 && $a=5) // same as in PHP
    

    这与$b = (1 && 5) 相同(赋值“返回”分配的值)并将5 分配给$b


    底线是:运算符优先级在 Perl 和 PHP 中是相同的(至少在这种情况下),但它们在布尔运算符返回的值上有所不同。

    FWIW,PHP的运算符优先级可以找到here


    更有趣的是(至少这对我来说是新的)是 PHP 不为递增/递减运算符执行类型转换。

    所以如果$btrue,那么$b++ 将值保留为true,而例如$b += 12 分配给 $b


    †:我的意思是它返回第一个(最左边的)值

    • &&的情况下评估为false
    • ||的情况下评估为true

    或表达式的最后一个值。

    【讨论】:

    • 在 Python 中,它返回第一个 false 转换为 false 或最后一个过度。我认为 Perl 也是这样做的
    • @JeRog - && 表达式将在遇到错误值时停止计算,因此在1&&0&&5 中,0 是最后一个值。同样,1&&undef&&5 将评估为 undef
    • @Je Rog && 如果左参数为假,则返回左参数;否则,它会返回正确的参数。 || 如果其左参数为真,则返回其左参数,否则返回其右参数。所以&& 链返回最左边的假值(或最后一个值,如果全部为真),|| 链返回最左边的真值(或最后一个值,如果都为假)。
    • @RiaD:对。我认为更好的表达方式是:它返回决定表达式最终结果的值。已更新。
    【解决方案2】:

    第一个例子

    $a = 2;
    $b = 3;
    if($b=1 && $a=5)  // means $b = (1 && $a=5)
    {
       var_dump($b); //bool(true) because of &&
       $a++;
       $b++; //bool(true)++ ==true, ok
    }
    echo $a.'-'.$b;
    

    希望您不要在生产中使用这些代码)

    我是 perl 的菜鸟,但我可以建议 a&&b 返回 a 或 b(如果它们都转换为布尔值,则返回最后一个),而不是布尔值,然后 $b = (1 && $a=5) 返回 $b= 5(是 5)

    【讨论】:

    • 这很有见地,但没有回答 OP 的问题。为什么 php 认为 $b 是布尔值? perl 在 OP 的示例中到底在做什么?
    • 让你想知道是否将赋值放在一个条件提示的 PHP 中,你想要一个布尔值而不是数字,所以它转换为错误的类型......
    • 现在我找到了为什么它是布尔值。(我认为它是因为运算符优先级)
    • @Asaph 问题是关于 PHP 和 Perl 中的优先级之间的差异。为什么 OP 的例子中没有 Perl?
    • @Asaph,显然 PHP 将其解释为 $b=(1 && $a=5)
    【解决方案3】:

    问题是:1 && 5 在 perl 中返回 5。如果您将条件编码为if(($b=1) && ($a=5))

    ,您将获得预期的结果

    【讨论】:

      【解决方案4】:

      对于 Perl,图。 2:and在perl中的优先级很低,它不是&&的同义词。因此,样本以(($a = 5) and ($b = 1)) 执行,它将 $a 和 $b 分别设置为 5 和 1,并返回最后一个参数的值(即 1)。

      在 ++ 之后你得到 6-2。

      【讨论】:

        【解决方案5】:

        请参阅http://sillythingsthatmatter.in/PHP/operators.php 以获得良好示例

        【讨论】:

          猜你喜欢
          • 2012-08-10
          • 2018-04-02
          • 1970-01-01
          • 1970-01-01
          • 2013-11-22
          • 1970-01-01
          • 1970-01-01
          • 2022-11-16
          • 2011-06-21
          相关资源
          最近更新 更多