5

假设我有两个函数和一个变量,

int number;

bool foo (void);
bool footoo (void);

在每个函数中,number都会发生一些与变量相关的逻辑,例如:

number++;
return(rand()%2);

然后我这样称呼他们:

if (foo() && footoo())
{
    cout << "Two foo true!"
}

为什么两个函数都没有被调用,我如何保证两个函数都被调用和 increment number,而不管返回值如何?

4

6 回答 6

9

在 C 中(并且默认包含在 C++ 中),&&运算符是short-circuiting. 这意味着一旦条件被认为是假的,就不会计算另一个操作数。它允许我们if(ptr && ptr->value == 10)在单独的 if 语句中进行值检查之前无需进行指针有效性检查。

如果要运行这两个函数,请运行这两个函数并保存结果:

bool b = foo();
if(foobar() && b)
{
    // Stuff
}
于 2013-07-30T20:26:56.137 回答
3

我能想到的最简单的事情:将两者的返回值分配给变量并检查它们:

bool fooIsTrue = foo();
bool footooIsTrue = footoo();
if(fooIsTrue && footooIsTrue)
    // ...

他们现在没有被调用,因为&&短路,也就是说,当左边为假时,整个表达式肯定是假的,所以右边被跳过。

这对于结构很有用,例如,您想在检查之前先检查是否可以访问某些内容,如下所示:

if(somePtr != NULL && somePtr[0] == 1)
于 2013-07-30T20:27:13.733 回答
2

为什么两个函数都没有被调用?它被称为“短路评估”,是 C++ 的一个效率特性。基本原理(大致)是在测试上下文中调用的代码通常没有副作用,因此如果您可以通过仅评估最左边的表达式来确定测试将失败,那么您应该这样做。

您的代码并非没有副作用,因此在这种情况下,短路评估不是对您有帮助的功能。

为了保证调用这两个函数,您需要将它们与返回值的测试分开调用:

bool fooRet = foo();
bool footooRet = footoo();

if (fooRet && footooRet)
{
    cout << "Two foo true!"
}
于 2013-07-30T20:26:48.760 回答
1

&&并且||是我们所说的短路算子。这意味着如果通过评估第一个参数我们可以判断整个表达式的真实性,我们停止并且不评估下一个表达式。

例如,如果这个陈述a && ba假的,我们知道整个陈述不可能是真的,因此可以停止。||如果第一个陈述为真,我们可以停止 。

如果您希望调用这两个函数,第一个函数必须返回一个可以评估为 true 的值。如果您希望两者都被调用,则可以执行此操作。

bool a = foo();
bool b = footoo();
if (a && b)
{
    cout << "Two foo true!"
}

这样两者都被调用。

在 C++ 中,布尔值保证为 1 或 0,因此位运算符实际上与结果的短路相同。但是,我不会将它们用于可读性。

于 2013-07-30T20:27:16.970 回答
1

在涉及的if语句中&&(类似于if (a && b && c && d)),如果第一个条件是,则不再评估false中的其余条件并执行“块”。iffalse

同样的事情发生在||. 如果您有if (a || b || c || d)and ais true,则不会评估其余条件并true执行“块”。

如果您希望同时调用它们,只需将它们分配给两个boolean变量,例如bool myB1 = foo(), myB2 = footoo();然后执行if (myB1 && myB2)

于 2013-07-30T20:27:44.093 回答
-1

因为 with statement if(first && second),如果first不是真的,second甚至不检查。

于 2013-07-30T20:33:12.080 回答