是否有合理的& C ++中的运算符?例如一个像&&和除了它还评估后面的参数,即使前面的一些参数已经评估为假?运营商&是我理解的按位和操作符。
答案 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节虽然如上所述,这是一个非常糟糕的主意并让人感到困惑。如果您有一个非常特殊的情况,您可能希望以非常有限的方式进行此操作。