如何使用逻辑AND运算符(&&)c ++调用这两个函数

时间:2013-07-30 20:21:49

标签: c++ bitwise-operators logical-operators

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

int number;

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

在每个函数中,都会出现一些变量为number的逻辑,例如:

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

然后我称他们为:

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

为什么不调用这两个函数?如何调用这两个函数并递增number,而不管返回值是什么?

6 个答案:

答案 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 && ba为假,我们知道整个语句不能为真,因此可以停止。使用||,如果第一个语句为真,我们就可以停止。

如果要调用这两个函数,则第一个函数必须返回一个可以计算为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