c++:是 (a || b) || c;相当于 if (!a && !b) { c; }

问题描述 投票:0回答:1

我正在更新别人的代码。

他们做了以下事情:

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,在不太可能的情况下会产生差异。

c++ c++17 logic boolean-logic
1个回答
0
投票

德摩根定律涵盖了两个表达式值的等价性。为了确保评估

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
© www.soinside.com 2019 - 2024. All rights reserved.