\$40

Image of the Day Submit

IOTD | Top Screenshots

Magical if-statement

8 replies to this topic

#1ysg  Members

Posted 12 March 2013 - 12:15 PM

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 .

#2C0lumbo  Members

Posted 12 March 2013 - 12:28 PM

POPULAR

If it's a floating point number with a NaN value then (foo != foo) and the code could go into the else block.

#3ysg  Members

Posted 12 March 2013 - 01:25 PM

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 .

#4mhagain  Members

Posted 12 March 2013 - 02:50 PM

POPULAR

Of course if it's C++ and someone has overloaded operator == then literally anything could happen.

Edited by mhagain, 12 March 2013 - 02:51 PM.

It appears that the gentleman thought C++ was extremely difficult and he was overjoyed that the machine was absorbing it; he understood that good C++ is difficult but the best C++ is well-nigh unintelligible.

#5Bacterius  Members

Posted 13 March 2013 - 01:52 AM

POPULAR

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.

“If I understand the standard right it is legal and safe to do this but the resulting value could be anything.”

#6Buster2000  Members

Posted 14 March 2013 - 02:58 AM

Couldn't foo and bar also be declared volotile?

#7Tournicoti  Prime Members

Posted 14 March 2013 - 05:45 AM

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

Edited by Tournicoti, 14 March 2013 - 05:46 AM.

#8Hodgman  Moderators

Posted 14 March 2013 - 06:18 AM

POPULAR

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);
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.

#9ysg  Members

Posted 14 March 2013 - 07:54 AM

Couldn't foo and bar also be declared volotile?

I don't think I've ever used volatile in my entire coding career.