C ++逻辑&操作者

时间:2011-08-01 13:44:07

标签: c++

是否有合理的& C ++中的运算符?例如一个像&&和除了它还评估后面的参数,即使前面的一些参数已经评估为假?运营商&是我理解的按位和操作符。

4 个答案:

答案 0 :(得分:21)

运营商&确实是按位运算符。我假设你有像

这样的东西
if ( f() && g() ) { /*do something*/ }

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

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

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

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

答案 1 :(得分:4)

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) ...

答案 2 :(得分:1)

没有逻辑&,只有按位&

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

答案 3 :(得分:0)

如果操作员和放大器过载,它就不会短路。

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节

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