假设我有两个函数和一个变量,
int number;
bool foo (void);
bool footoo (void);
在每个函数中,都会出现一些变量为number
的逻辑,例如:
number++;
return(rand()%2);
然后我称他们为:
if (foo() && footoo())
{
cout << "Two foo true!"
}
为什么不调用这两个函数?如何调用这两个函数并递增number
,而不管返回值是什么?
答案 0 :(得分:6)
在C中(默认情况下包含在C ++中)&&
运算符为short-circuiting
。这意味着一旦条件被认为是假,则不评估其他操作数。它允许我们执行if(ptr && ptr->value == 10)
之类的操作,而不必在单独的if语句中进行值检查之前进行指针有效性检查。
如果要运行这两个功能,运行两个功能并保存结果:
bool b = foo();
if(foobar() && b)
{
// Stuff
}
答案 1 :(得分:2)
为什么不调用这两个函数?它被称为“short-circuit evaluation”,是C ++的效率特性。理由(粗略地)是在测试环境中调用的代码通常是无副作用的,因此如果您只通过评估最左边的表达式来确定测试将会失败,那么您应该这样做。
您的代码不是无副作用的,因此在这种情况下,短路评估不是一种可以帮助您的功能。
为了保证调用这两个函数,您需要在返回值的测试中单独调用它们:
bool fooRet = foo();
bool footooRet = footoo();
if (fooRet && footooRet)
{
cout << "Two foo true!"
}
答案 2 :(得分:2)
我能想到的最简单的事情:将两者的返回值分配给变量并检查它们:
bool fooIsTrue = foo();
bool footooIsTrue = footoo();
if(fooIsTrue && footooIsTrue)
// ...
他们现在没有被调用,因为&&
短路,也就是说,当左边是假时,整个表达式肯定是假的,所以跳过了右边。
这对于构造非常有用,例如,您可以在检查之前先检查是否可以访问某些内容:
if(somePtr != NULL && somePtr[0] == 1)
答案 3 :(得分:1)
&&
和||
就是我们所说的short circuit operators。这意味着如果通过评估第一个参数,我们可以告诉整个表达式的真实性,我们就会停下来,不要评估下一个表达式。
例如,如果在此语句a && b
中a
为假,我们知道整个语句不能为真,因此可以停止。使用||
,如果第一个语句为真,我们就可以停止。
如果要调用这两个函数,则第一个函数必须返回一个可以计算为true的值。如果要同时调用它们,可以执行此操作。
bool a = foo();
bool b = footoo();
if (a && b)
{
cout << "Two foo true!"
}
这两种方式都被称为。
在C ++中,bool的保证是1或0,因此按位运算符实际上与结果的短路相同。但是我不会将它们用于可读性。
答案 4 :(得分:1)
在涉及if
的{{1}}语句中(类似&&
),如果第一个条件为if (a && b && c && d)
,那么false
中的其余条件1}}不再被评估,if
&#34;阻止&#34;被执行。
同样的事情发生在false
上。如果您||
且if (a || b || c || d)
为a
,那么其他条件不会被评估,true
&#34;阻止&#34;被执行。
如果您想要同时调用它们,只需将它们分配给两个true
变量,例如boolean
,然后执行bool myB1 = foo(), myB2 = footoo();
。
答案 5 :(得分:-1)
如果if(first && second)
不成立,则发出声明first
,甚至不检查second
。