if (foo == foo || bar == bar) {
...
}
else {
...
}
This is an old one. My software lead did this, I showed it to her and she said: Umm... I... yeah... I wasn't thinking :) .
We both laughed and I rewrote it all :) .
if (foo == foo || bar == bar) {
...
}
else {
...
}
This is an old one. My software lead did this, I showed it to her and she said: Umm... I... yeah... I wasn't thinking :) .
We both laughed and I rewrote it all :) .
If it's a floating point number with a NaN value then (foo != foo) and the code could go into the else block.
If it's a floating point number with a NaN value then (foo != foo) and the code could go into the else block.
I'm 90% certain that it was an into of some sort. It was pretty funny and
we both were like, yeah, this will not be mentioned in polite company
ever again :) .
Of course if it's C++ and someone has overloaded operator == then literally anything could happen.
Of course, one could have written #define foo rand() and #define bar time(0) to be particularly treacherous. Then it would make sense. Sort of.
when x is a floating point number, if (x!=x) permits to check if x is NaN. This is terribly ugly .... but that's it
Couldn't foo and bar also be declared volotile?
Yeah, without volatile foo==foo compiles to pseudo-asm like:
int reg0 = read(&foo);
bool reg1 = compare( reg0, reg0 );
But with volatile, it would compile to something like:
int reg0 = read(&foo);
int reg1 = read(&foo);
bool reg2 = compare( reg0, reg1 );
So if the memory at &foo is constantly changing, the comparison could possibly be false.
However, that kind of code should probably never be written. Generally if your code contains volatile, then you have a bug
About the only place it's valid to see that keyword used, would be inside the implementation of std::atomic.