我目前正在使用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;但我真的很想知道为什么会这样。
答案 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可以是函数/变量/表达式.....