Luc*_*ano 30 c++ operators logical-operators
tl; dr:C++中是否存在非短路逻辑AND(类似于&&)?
我有两个我想调用的函数,并使用返回值来计算第三个复合函数的返回值.问题是我总是希望评估两个函数(因为它们输出有关系统状态的日志信息)
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) );
}
Run Code Online (Sandbox Code Playgroud)
当然,条件语句是不是在功能那么简单,是的,我知道我可以使用临时变量来存储的两个函数的返回,接着做临时变量"短路"的逻辑,但我想知道是否有一个"优雅"的语言解决方案来保持Func3中的单行返回,同时仍然从两个函数获取日志消息.
答复摘要:
"按位"运算符| 和&可用于获得效果,但仅当返回类型为bool时.我在ANSI C++规范中没有提到这一点.从我可以告诉,这个工程因为"布尔"被转换为int(真= 1,假= 0),然后将位运算符时,则转换回一个布尔值.
也可以使用运算符" +
"和" *
".这在ANSI C++规范中没有提到,但可能因为与上述相同的原因而起作用." +
"给"或"因为true被转换为1,然后除了0之外的任何东西都被转换回true." *
"适用于"和"因为1(真)*0(假)== 0(假)和1(真)*1(真)== 1(真)
这两个似乎都依赖于隐式类型转换为整数然后回到bool.这些都可能会破坏任何试图维护代码的人.
其他回答归结为"只使用临时"或"实施自己",这不是问题.目标是查看是否已经在C++标准中实现了运算符.
Meh*_*ari 33
该&
操作者为进行逻辑"与"操作bool
的操作数,而不是短路.
这不是一个序列点.您不能依赖于操作数的评估顺序.但是,保证两个操作数都被评估.
我不建议这样做.使用临时变量是更好的解决方案.不要牺牲"聪明代码"的可读性.
Ed *_* S. 23
是的,我知道我可以使用临时变量来存储的两个函数的返回,接着做临时变量"短路"的逻辑,但我想知道如果有一个"优雅"的语言解决方案,以保持Func3中的单行返回,同时仍然从两个函数获取日志消息.
这将是"优雅"的解决方案:).依赖于评估顺序的副作用将远非优雅,容易出错,并且对于漫游到您的项目中的下一个开发人员来说难以理解.依赖于副作用当然与下面的代码段形成鲜明对比,这是一个完全合乎逻辑且有效的用例,仅依靠评估顺序:
if ( obj != NULL && obj->foo == blah ) { /* do stuff */ }
Run Code Online (Sandbox Code Playgroud)
Mot*_*tti 13
是的,有内置的运营商这样做.
+
进行非短路OR并*
进行AND 运算.
#include <iostream>
using namespace std;
void print(bool b)
{
cout << boolalpha << b << endl;
}
int main()
{
print(true + false);
print(true * false);
}
Run Code Online (Sandbox Code Playgroud)
输出:
真正
假