retval=false&&;someFunction();//是否调用someFunction()? 我目前正在使用DIABC 4.4 C++编译器。这是一个完全的POS,不符合ANSI标准,我在过去发现了它的问题
我想知道下面的问题是编译器的问题,还是我对C语言知识的不足++ 我意识到x=x&&y;如果x为假,将使y部分短路。在x=x&&y()的情况下,编译器所做的是短路;其中y()是一个非常量函数retval=false&&;someFunction();//是否调用someFunction()? 我目前正在使用DIABC 4.4 C++编译器。这是一个完全的POS,不符合ANSI标准,我在过去发现了它的问题,c++,C++,我想知道下面的问题是编译器的问题,还是我对C语言知识的不足++ 我意识到x=x&&y;如果x为假,将使y部分短路。在x=x&&y()的情况下,编译器所做的是短路;其中y()是一个非常量函数 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
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,那么当retval为false时,编译器是否跳过了.someFunction(),从而超出了它的界限
此外,我意识到通过编写retval=A.someFunction()&&retval;但我真的很想知道为什么会发生这种情况。短路适用于所有表达式,而不管
常数如何。跳过对someFunction()
的调用是正确的。短路适用于所有表达式,无论常数如何。跳过对someFunction()
的调用是正确的。对&&
的第二个操作数是否为常量并不重要。第一个操作数计算为false
后,返回值已知,因此没有理由计算第二个操作数
如果函数有需要执行的副作用,请将其放在第一位。到&&
的第二个操作数是否为常量并不重要。第一个操作数计算为false
后,返回值已知,因此没有理由计算第二个操作数
如果函数有需要执行的副作用,请将其放在第一位。定义了&&&
和|
运算符以惰性方式进行计算,这就是语言的工作方式。如果希望副作用总是发生,请首先调用函数并隐藏结果,或者重构函数以将工作从状态查询中分离。定义了&&
和|
运算符以进行惰性计算,这就是语言的工作方式。如果希望副作用总是发生,请先调用函数并隐藏结果,或者重构函数以将工作从状态查询中分离。短路计算与常量或非常量无关。不管发生什么,它都会发生
语句A()&&B()如果(A())B(),代码>将完全执行的操作
可以(尽管它不是一个完美的替代品,因为第二个允许使用else
)。这有时用于将语句更改为表达式(例如在编写宏或将其嵌入另一个语句时)。短路计算与常量或非常量无关。不管发生什么,它都会发生
语句A()&&B()如果(A())B(),代码>将完全执行的操作
可以(尽管它不是一个完美的替代品,因为第二个允许使用else
)。这有时用于将语句更改为表达式(例如在编写宏或将其嵌入另一个语句时)。该&&运算符也称为快捷运算符,这意味着仅当第一部分返回true时,它才计算第二部分。这就是&&和&:
value = func1() && func2(); // evaluates func2() only if func1() returns true
value = func1() & func2(); // evaluates both func1() and func2()
&&运算符也称为快捷方式运算符,这意味着它仅在第一部分返回true时计算第二部分。这就是&&和&:
value = func1() && func2(); // evaluates func2() only if func1() returns true
value = func1() & func2(); // evaluates both func1() and func2()
对于&&运算符
1 && X = X
0 && X = 0
所以在第一个变量为0的情况下,编译器将把表达式求值为0,毫无疑问,X是什么
编译器将忽略X部分,因为它不会影响结果。这里X可以是任何东西函数/变量/表达式 对于&&运算符
1 && X = X
0 && X = 0
所以在第一个变量为0的情况下,编译器将把表达式求值为0,毫无疑问,X是什么
编译器将忽略X部分,因为它不会影响结果。这里X可以是任何东西函数/变量/表达式 正如其他人所解释的,| |和&&始终执行短路评估
还要注意,短路评估非常有用,因为它可以让您编写如下代码:
retval = obj_pointer && obj_pointer->SomeBooleanMethod();
如果没有短路评估,这将在空指针上崩溃。正如其他人所解释的,| |和&&始终执行短路评估
还要注意,短路评估非常有用,因为它可以让您编写如下代码:
retval = obj_pointer && obj_pointer->SomeBooleanMethod();
如果没有短路求值,这将在空指针上崩溃。没有意识到求值是懒惰的。现在更有意义了……或者如果两个操作数都是/返回布尔值,则使用(&E)。没有意识到计算是懒惰的。现在更有意义了……或者如果两个操作数都是/返回布尔值,则使用&实际上,&&
和&
与短路行为有很大不同((0x10&0x01)==1)
但((0x10&0x01)==0)
。实际上,&
和&
的区别远远不止于短路行为((0x10&0x01)==1)
但((0x10&0x01)==0)
。请注意,只有&&form是右值。你不能说:C=if(A())B();是的,它更接近C=A()?():()(除)()(0),1,C和For或C++中的真或假。它不会返回任何一个操作数,除非它们的值恰好为0或1或false或true。请注意,只有&&形式是右值。你不能说:C=if(A())B();是的,它更接近C=A()?():()(除)()(0),1,C和For或C++中的真或假。它不返回任何一个操作数,除非它们的值恰好为0或1或false或true。这并不能说明全部情况。当然,如果左边的pa