I'm updating somebody else's code.
They did the following :
bool a();
bool b();
a() || b() || std::clog << "whine about something" << std::endl;
I'm replacing the std::clog
bit with a void function and the compiler doesn't like that because it can't convert void
to bool
.
So... I decided to go with:
if (!a() && !b()) {
c(); // Replacement to the clog bit.
}
Would this behave the same?
Note: This code was originally likely written in c++03 or c++11, but we're using c++17 now, in the unlikely case that makes a difference.
I'm updating somebody else's code.
They did the following :
bool a();
bool b();
a() || b() || std::clog << "whine about something" << std::endl;
I'm replacing the std::clog
bit with a void function and the compiler doesn't like that because it can't convert void
to bool
.
So... I decided to go with:
if (!a() && !b()) {
c(); // Replacement to the clog bit.
}
Would this behave the same?
Note: This code was originally likely written in c++03 or c++11, but we're using c++17 now, in the unlikely case that makes a difference.
The equivalence of the two expressions values is covered by De Man's Law. To make sure short-cuirciting behavior is correct with regard to evaluating b()
consider that if a()
is true
then b()
will not be evaluated. This is the case for the two alternatives as you can convince yourself by examining the 4 possible cases:
#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);
}
Output:
a
a
ab
abc
---
a
a
ab
abc
a
andb
are functions? – Igor G Commented Nov 18, 2024 at 17:30if
version, another way of rewritea() || b() || (c(), true);
. – Jarod42 Commented Nov 18, 2024 at 17:38