C++ 如何使用逻辑AND运算符(&;&;)c++;

C++ 如何使用逻辑AND运算符(&;&;)c++;,c++,logical-operators,logical-and,C++,Logical Operators,Logical And,假设我有两个函数和一个变量 int number; bool foo (void); bool footoo (void); 在这些函数中的每一个函数中,都会发生一些带有变量number的逻辑,例如: number++; return(rand()%2); 然后我这样称呼他们: if (foo() && footoo()) { cout << "Two foo true!" } if(foo()&&footoo()) { CUT< P>为什么两个函数都

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

int number;

bool foo (void);
bool footoo (void);
在这些函数中的每一个函数中,都会发生一些带有变量
number
的逻辑,例如:

number++;
return(rand()%2);
然后我这样称呼他们:

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

CUT< P>为什么两个函数都不被调用?它被称为“”,是C++的一个效率特性。基本原理是,在测试上下文中调用的代码通常是无副作用的,因此,如果您可以通过只评估最左边的表达式来确定测试失败,则应该这样做。 您的代码不是没有副作用的,因此短路评估在这种情况下并不是一个可以帮助您的功能

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

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

if (fooRet && footooRet)
{
    cout << "Two foo true!"
}
bool fooRet=foo();
bool footooRet=footoo();
if(fooRet&&footeoret)
{
CUT< P>在C++中(默认情况下包含在C++中)<代码> & & < /代码>运算符是代码>短路< /代码>。这意味着一旦条件被视为假,其他操作数就不被评估。它允许我们做诸如<代码>(PTR & & PTR>value=10)的事情。
无需在单独的if语句中进行值检查之前进行指针有效性检查

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

bool b = foo();
if(foobar() && b)
{
    // Stuff
}

我能想到的最简单的事情是:将这两个变量的返回值都赋给变量并检查它们:

bool fooIsTrue = foo();
bool footooIsTrue = footoo();
if(fooIsTrue && footooIsTrue)
    // ...
现在没有调用它们,因为
&&
短路,也就是说,当左侧为false时,整个表达式肯定为false,因此跳过右侧

这对于构造非常有用,例如,您希望在检查之前先检查是否可以访问某个对象,如:

if(somePtr != NULL && somePtr[0] == 1)

&&
|
就是我们所说的。这意味着,如果通过计算第一个参数,我们可以判断整个表达式的真实性,那么我们就停止计算下一个表达式

例如,如果在该语句中
a&&b
a
为假,我们知道整个语句不可能为真,因此可以停止。使用
|
可以在第一个语句为真时停止

如果希望调用两个函数,则第一个函数必须返回一个可计算为true的值。如果希望调用两个函数,则可以执行此操作

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

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

同样的情况也发生在
|
上。如果有
如果(a | | b | | | c | | | d)
a
,则不计算其余条件,并执行
“块”


如果您想调用这两个变量,只需将它们赋给两个
boolean
变量,如
bool myB1=foo(),myB2=footoo();
,然后执行
If(myB1&&myB2)
,因为使用语句
If(first&&second)
,如果
第一个
不是真的,
第二个
甚至没有被检查。

你最好保持它简单易读:
bool b1=foo();bool b2=footoo();if(b1&&b2){/*…*/}
如果(foo()+footoo()=2)可能重复
虽然可能是真的,但实际上我可以使用位来避免副作用。这不是我真正要说的——对数据进行更改的函数有副作用;只执行比较、返回和回答的函数没有副作用。您的函数进行更改,所以它们有副作用,测试em使用短路运算符,如果你需要调用它们,不管发生什么。@JimHurley我不会使用按位运算符,这会让外部用户对代码感到困惑,而且还会有副作用Hanks伙计们,我已经相应地编辑了我的代码。我不知道这样使用按位运算符是错误的。不,在一个问题,以及“when first is false seconds is not check”语句由于已知的共轭逻辑值正是OP问题的答案,但感谢你的否决票,你真的做出了贡献。我是OP。但我的错,问题中没有说明答案。但是,它无法回答这两个问题,并且比提供的其他答案信息更少。-1。