retval = false && someFunction(); // someFunction()会被调用吗?

Mik*_*wis 1 c++

我目前正在使用Diab 4.4 C++编译器.它是一个完全POS,不符合ANSI标准,我在过去发现了它的问题.

我想知道以下问题是编译器的问题,还是我对C++的一个缺点

我意识到x = x && y的形式; 如果x为假,则会使y部分短路.在x = x && y()的情况下,编译器正在做的是短路; 其中y()是非const函数.

class A
{
int _a;
A(int a) { _a = a; }
bool someFunction() { _a = 0; return true; } 
};

main(...)
{
A obj = A(1);
bool retval = false;

retval = retval && A.someFunction();

/* What is the value of A._a here? */
}
Run Code Online (Sandbox Code Playgroud)

我觉得错误的是编译器正在进行这种短路,即使someFunction()不是const函数.如果它不是const,那么当retval为false时,编译器是否通过跳过A.someFunction()来超越其边界?

此外,我意识到可以通过编写retval = A.someFunction()&& retval来避免这个问题; 但我真的很想知道为什么会这样.

Joh*_*kin 10

无论const-ness 如何,短路都适用于所有表达式.跳过呼叫someFunction()是正确的.


moo*_*dow 7

&&||运营商定义的延迟计算,这是语言的工作方式.如果您希望始终发生副作用,请先调用函数并存储结果,或重构函数以将工作与状态查询分开.


Jos*_*ley 5

正如其他人所解释的那样,|| 和&&总是进行短路评估.

另请注意,短路评估非常有用,因为它可以让您编写如下代码:

retval = obj_pointer && obj_pointer->SomeBooleanMethod();
Run Code Online (Sandbox Code Playgroud)

如果没有短路评估,这将在NULL指针上崩溃.