简述:在C++中是否存在非短路逻辑与(类似于&&)?
我有两个函数要调用,并使用它们的返回值来确定第三个组合函数的返回值。问题是我希望这两个函数始终都被计算(因为它们输出有关系统状态的日志信息)。
例如:
bool Func1(int x, int y){
if( x > y){
cout << "ERROR- X > Y" << endl;
}
}
bool Func2(int z, int q){
if( q * 3 < z){
cout << "ERROR- Q < Z/3" << endl;
}
}
bool Func3(int x, int y, int z, int q){
return ( Func1(x, y) && Func2(z, q) );
}
当然,在函数内部,条件语句并不那么简单,我知道我可以使用临时变量来存储两个函数的返回值,然后在临时变量上执行“短路”逻辑,但我想知道是否有一种“优雅”的语言解决方案,可以保持Func3中的单行返回,并仍然从两个函数获取日志消息。回应摘要:
“按位”运算符|和&可以用于实现效果,但只适用于返回类型为布尔型的情况。我没有在ANSI C ++规范中找到这方面的提及。据我所知,这可行是因为“bool”转换为int(true = 1,false = 0),然后使用按位运算符,然后再将其转换回bool。
运算符“+”和“*”也可以使用。尽管这在ANSI C ++规范中没有提到,但可能是因为与上述相同的原因。由于true被转换为1,“+”给出“或”;任何非零值都被转换回true。“*”适用于“and”,因为1(true)* 0(false)== 0(false),1(true)* 1(true)== 1(true)。
这两种方法似乎都依赖于隐式类型转换为整数,然后再转换回布尔值。这两种方法都可能会使维护代码的人困惑。
其他反应可以归结为“只使用临时变量”或“实现自己”,这并不是问题的答案。目标是看看是否已经在C ++标准中实现了运算符来解决这个问题。
volatile uchar retVal1 = Func1(); volatile uchar retVal2 = Func2(); if(retVal1 && retVal2) { // Do my stuff }
这确保程序评估两个变量(即调用两个函数),因此您可以在条件中使用它们。 - davidanderle