我目前正在使用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来避免这个问题; 但我真的很想知道为什么会这样.
正如其他人所解释的那样,|| 和&&总是进行短路评估.
另请注意,短路评估非常有用,因为它可以让您编写如下代码:
retval = obj_pointer && obj_pointer->SomeBooleanMethod();
Run Code Online (Sandbox Code Playgroud)
如果没有短路评估,这将在NULL指针上崩溃.