繁体   English   中英

C ++逻辑和运算符

[英]C++ logical & operator

C ++中是否有逻辑&运算符? 例如,一个与&&一样工作的运算符,除了它还评估后面的参数,即使前面的参数已经评估为false? 运算符&是我理解的按位和运算符。

运算符&确实是按位运算符。 我假设你有类似的东西

if ( f() && g() ) { /*do something*/ }

并且你想要执行f()和g(),无论其中一个是否被评估为false。 我建议你做点其他事情:

bool bF = f();
bool bG = g();

if ( bF && bG ) { /*do something*/ }

这也提供了更好的可读性,并且不会混淆尝试维护代码的其他程序员。 从长远来看,这是值得的。

在C ++中没有这样的“always execute”操作符。

我的第一个倾向是,您应该重新评估您的方法所做的工作,以消除任何强制执行它们的副作用,而不是寻找新的操作符。 以这种方式可以简单地使用&&并且快乐。

但是如果你真的想按顺序完成所有操作,然后看看它们是否都成功了,那么Luchian Grigore的回答可能是最好的。 它清楚地描述了它始终需要执行的顺序步骤。 还有一个选项可能会或可能不会更清楚:

// Each method needs to execute in sequence but we use "success" to track overall success. The order of operands to `operator&&` shouldn't be changed.
bool success = f1();
success = f2() && success;
success = f3() && success;

if(success) ...

没有逻辑& ,只有一个按位&

如果你想避免逻辑语句的短路,你需要使用一个代理,不会被编译器优化掉来实现它(比如一个可变元元模板)。

如果操作员&&过载,它不会短路。

struct Bool {
  bool val;
  Bool(bool f): val(f) {}
  operator bool() {
    return val;    
  }
};


bool operator&&(Bool a, Bool b) {
  return (bool)a && (bool)b;
}

ref:第19点, C ++ FAQ lite中的第13.9节

虽然如上所述,这是一个非常糟糕的主意 ,让人困惑。 如果您有一个非常特殊的情况,您可能希望以非常有限的方式进行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM