【发布时间】:2010-12-18 00:48:29
【问题描述】:
tl;dr:C++ 中是否存在非短路逻辑与(类似于 &&)?
我有 2 个要调用的函数,并使用返回值来计算第三个复合函数的返回值。问题是我总是希望这两个函数都进行评估(因为它们输出有关系统状态的日志信息)
IE:
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 中保持单行返回,同时仍然从两个函数获取日志消息。
回复摘要:
“按位”运算符 |和 & 可用于获得效果,但前提是返回类型为 bool。我在 ANSI C++ 规范中没有提到这一点。据我所知,这是可行的,因为“bool”被转换为int(true = 1,false = 0),然后使用按位运算符,然后将其转换回bool。
也可以使用运算符“+”和“*”。这在 ANSI C++ 规范中没有提到,但可能由于与上述相同的原因而起作用。 "+" 给出 "or" 因为 true 被转换为 1,然后除了 0 之外的任何东西都被转换回 true。 "*" 适用于 "and" 因为 1 (true) * 0 (false) == 0(false) 和 1(true) * 1(true) == 1(true)
这两者似乎都依赖于隐式类型转换为整数然后再返回布尔值。这两者都可能会搞砸试图维护代码的人。
其他回答归结为“只使用临时人员”或“实施你自己的”,这不是问题所在。目标是查看是否已经在 C++ 标准中实现了一个运算符来执行此操作。
【问题讨论】:
-
我只会使用临时的。它至少与调用 if() 中的函数一样清晰,并且您不必寻找晦涩的方法来使您的方法起作用。
-
“优雅:在运动或执行中展现轻松的美感和简洁性”如果临时变量轻松(编写和理解)并且简单地实现了您的目标,那么它是否优雅?
-
我认为您可以只使用临时 volatile 变量,如:
volatile uchar retVal1 = Func1(); volatile uchar retVal2 = Func2(); if(retVal1 && retVal2) { // Do my stuff }这可确保程序评估两个变量(也称为调用两个函数),因此您可以在您的条件下使用它们。 -
@davidanderle,不需要 volatile。 Func1() 和 Func2() 无论如何都会被调用。
标签: c++ operators logical-operators