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

时间:2009-09-10 17:35:01

标签: c++

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

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

我意识到x = x&&的形式Ÿ;如果x为假,则会使y部分短路。在x = x&&amp ;;的情况下,编译器正在做的是短路。 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? */
}

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

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

7 个答案:

答案 0 :(得分:10)

短路适用于所有表达式,无论const - 是什么。跳过someFunction()的来电是正确的。

答案 1 :(得分:7)

&&||运算符被定义为懒惰地评估,这是语言的工作方式。如果你想要总是发生副作用,首先调用函数并存储结果,或者重构函数以将工作从状态查询中分离出来。

答案 2 :(得分:5)

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

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

retval = obj_pointer && obj_pointer->SomeBooleanMethod();

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

答案 3 :(得分:4)

&&的第二个操作数是否为常量并不重要。在第一个操作数求值为false之后,返回值是已知的,因此没有理由计算第二个操作数。

如果该功能具有需要执行的副作用,请将其放在首位。

答案 4 :(得分:2)

短路评估与const或非const无关。无论如何都会发生。

语句A() && B();将完全执行if (A()) B();所做的事情(虽然它不是一个完美的替代品,因为第二个允许else)。这有时用于将语句更改为表达式(例如在编写宏时,或将其嵌入到另一个语句中)。

答案 5 :(得分:1)

&& operator也称为快捷方式运算符,这意味着如果第一部分返回true,它只评估第二部分。这是&&和&和&:

value = func1() && func2(); // evaluates func2() only if func1() returns true

value = func1() & func2(); // evaluates both func1() and func2()

答案 6 :(得分:1)

对于&&运营商,

1 && X = X
0 && X = 0

所以如果第一个var为0,编译器会将表达式计算为0,毫无疑问,X是什么。

编译器将忽略X部分,因为它不会影响结果。这里X可以是函数/变量/表达式.....