我正在更新别人的代码。
他们做了以下事情:
bool a();
bool b();
a() || b() || std::clog << "whine about something" << std::endl;
我用 void 函数替换
std::clog
位,编译器不喜欢这样,因为它无法将 void
转换为 bool
。
所以...我决定选择:
if (!a() && !b()) {
c(); // Replacement to the clog bit.
}
这会表现相同吗?
注意:此代码最初可能是用 c++03 或 c++11 编写的,但我们现在使用 c++17,在不太可能的情况下会产生差异。
德摩根定律涵盖了两个表达式值的等价性。为了确保评估
b()
时的短路行为是正确的,请考虑如果 a()
是 true
,则不会评估 b()
。两种选择都是这种情况,您可以通过检查 4 种可能的情况来说服自己:
#include<iostream>
template <bool s>
bool ab(bool x) {
std::cout << (s?"a":"b") ;return x;
}
auto a = &ab<true>;
auto b = &ab<false>;
bool c() {
std::cout << "c";
return true;
}
void original(bool aa,bool bb) {
a(aa) || b(bb) || c();
}
void alternative(bool aa,bool bb) {
if (!a(aa) && !b(bb)) c();
}
void test(auto f) {
f(true,true);
std::cout << "\n";
f(true,false);
std::cout << "\n";
f(false,true);
std::cout << "\n";
f(false,false);
std::cout << "\n";
}
int main() {
test(original);
std::cout << "---\n";
test(alternative);
}
输出:
a
a
ab
abc
---
a
a
ab
abc