C++中是否存在非短路逻辑"和"?

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的操作数,而不是短路.

这不是一个序列点.您不能依赖于操作数的评估顺序.但是,保证两个操作数都被评估.

建议这样做.使用临时变量是更好的解决方案.不要牺牲"聪明代码"的可读性.

  • 您最好对任何代码执行大量评论 - 任何具有一年以上经验的C开发人员都会看到`expr1&expr2`并"修复"它.使用临时变量是一个更好的解决方案. (29认同)
  • @Matt G:这适用于布尔人,但不是一般的.`1 && 2`产生`true`,而`1&2`产生'0`. (9认同)
  • 当然,在这里迂腐,OP要求非短路*逻辑*AND,而不是按位AND. (3认同)

Ed *_* S. 23

是的,我知道我可以使用临时变量来存储的两个函数的返回,接着做临时变量"短路"的逻辑,但我想知道如果有一个"优雅"的语言解决方案,以保持Func3中的单行返回,同时仍然从两个函数获取日志消息.

这将是"优雅"的解决方案:).依赖于评估顺序的副作用将远非优雅,容易出错,并且对于漫游到您的项目中的下一个开发人员来说难以理解.依赖于副作用当然与下面的代码段形成鲜明对比,这是一个完全合乎逻辑且有效的用例,仅依靠评估顺序:

if ( obj != NULL && obj->foo == blah ) { /* do stuff */ }
Run Code Online (Sandbox Code Playgroud)

  • 我还建议发表评论"必须执行这两个函数"或其他东西,否则其中一个乐观的程序员会说"哦,这些临时变量不需要*内联"......无论哪种方式(和/或临时变量) )将需要评论来澄清其用法 (4认同)

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)

输出:

真正

  • 我不知道我是否会在生产代码中不加任何评论地这样做,但这仍然很酷。 (2认同)
  • 很酷!这就是为什么我问这个问题:不一定要在生产代码中使用它,而是要学习一些东西。 (2认同)