在一个简单的项目工作期间,我发现了一些我不完全理解的情况。请考虑以下代码:
#include <iostream>
using namespace std;
bool test(int k)
{
cout << "start " << k << endl;
bool result; // it is important that result's value is opposite to initial value of recheck in main()
result = false;
return result;
}
int main()
{
bool recheck;
recheck = true;
for (int i = 2; i > -1; i--)
{
recheck = (recheck || test(i)); // (1)
cout << i << " ???" <<endl;
}
cout << "----------------------------" << endl;
cout << endl;
recheck = true;
for (int i = 2; i > -1; i--)
{
recheck = (test(i) || recheck); //different order that in (1)
cout << i << "???" <<endl;
}
return 0;
}
它会从for
循环中返回完全不同的结果:
2 ???
1 ???
0 ???
----------------------------
start 2
2???
start 1
1???
start 0
0???
似乎第一个test(int k)
甚至没有被调用。我怀疑它与||
运算符有关。有人可以解释这种行为吗?
答案 0 :(得分:13)
内置||
短路:如果左操作数为true
,则不评估右操作数(右操作数的值是什么并不重要,因为在这种情况下,||
表达式的值保证为true
。
为了完整性,但与问题没有特别相关:在c ++中,||
运算符是可重载的,就像许多其他运算符一样。如果使用过载,则不会发生短路。
答案 1 :(得分:1)
当其中一个操作数(从左到右评估)可以确定表达式的结果时,布尔运算符||
和&&
将短路没有参考其余的操作数。
对于||
,这意味着如果第一个操作数是true
,则不评估剩余的操作数,因为整个表达式的结果将始终为true
在第一个循环中,recheck
的本地变量main
始终为true
,因此函数调用test
永远不需要进行评估:它被跳过,你看不到输出。
在第二个循环中,首先计算test
函数调用,并且只能在调用函数后确定结果,因此每次迭代都会调用该函数,并且您会看到输出。
答案 2 :(得分:0)
您的评论说:
重要的是结果的值与main()
中的重新检查的初始值相反
您的test()
功能目前看不到recheck
的值,main()
是recheck
的本地值。
假设您的评论反映了您的意图,您需要将test()
作为参数传递给!
;然后,您可以使用一元result = ! recheck;
运算符,例如:
main()
当然,您需要修复test()
中的逻辑,以便在需要时调用{{1}}。
您的要求不够明确,我无法进一步评论。
答案 3 :(得分:0)
其他人已经解决了您提出的具体问题。请注意,要注意连续使用多个问号。 Trigraph序列以两个'??'开头字符和两个问号后的第三个字符的解释方式不同。