C/PHP中的复合布尔表达式和变量赋值

Bob*_*tys 0 php c operators

请原谅我,如果标题与我要求的完全不符,那我就很难准确地描述这个问题.

请考虑以下PHP代码:

#!/usr/bin/php
<?php
class foo{
    function bar()
    {
        return true;
    }
}
if (true && $a = new foo() && $a->bar()) {
    echo "true";
} else {
    echo "false";
}
Run Code Online (Sandbox Code Playgroud)

它给

Fatal error: Call to a member function bar() on a non-object
Run Code Online (Sandbox Code Playgroud)

对于$ a-> bar(); 表达.

考虑以下C代码:

int main(void)
{
    int i = 0;

    if (i += 1 && printf("%d\n", i))
    {
        printf("Done: %d.\n", i);
    }
}
Run Code Online (Sandbox Code Playgroud)

它输出:

0
Done: 1.
Run Code Online (Sandbox Code Playgroud)

为什么是这样?由于C和PHP声称要将这些表达式短路并从左到右进行求值,因此我希望在左边的表达式中设置的值设置在右边的表达式中.有什么我想念的吗?

And*_*ore 7

您现在的问题是运营商优先级.PHP目前正在评估您的PHP语句:

if (true && $a = ( new foo() && $a->bar() ) )
Run Code Online (Sandbox Code Playgroud)

在这种情况下$a,您尝试调用的时间没有定义$a->bar().

你真正想要的是这个:

if (true && ( $a = new foo() ) && $a->bar())
Run Code Online (Sandbox Code Playgroud)

在复杂条件下使用括号可以防止发生这类错误.

编辑:证明

if(true && $a = true && false) { }
var_dump($a); // bool(false)

if(true && ( $b = true ) && false) { }
var_dump($b); // bool(true)
Run Code Online (Sandbox Code Playgroud)