11 April 2008, 2:44 AM
I’ve found another interesting wrinkle in the ternary operator. So, here’s a bonus question for that quiz from last time. You start with the following code:
class Abstract;
class DerivedOne; // Inherits from Abstract
class DerivedTwo; // Inherits from Abstract
Abstract x;
DerivedOne one;
DerivedTwo two;
bool test;
Again, you can assume that all of these are defined/initialized (and you can assume the comments are correct—both Derived
* classes inherit from Abstract
). Now, consider these snippets:
# |
Code Snippet
A |
Code Snippet
B |
Bonus |
if (test) x = one;
else x = two;
|
x = (test ? one : two);
|
If you read the
previous installment, you’ve probably guessed by now that these are not equivalent, and you’d be right. In what ways do they differ?
Another unexpected answer →
8 April 2008, 11:54 PM
In today’s installment of “why not to program in C++,” I give you the following quiz, which Dustin, Steve, Tom, and I had to figure out today (Dustin’s code was doing the weirdest things, and we eventually traced it down to this):
Suppose you start out with the following code:
class Argument;
Argument x;
void Foo(const Argument& arg);
bool test;
You can assume that all of these are defined/initialized elsewhere in the code. For each pair of code snippets below, decide whether the two snippets are equivalent to each other.
# |
Code Snippet A |
Code Snippet B |
1 |
if (test) Foo(x);
else Foo(Argument());
|
Foo(test ? x : Argument());
|
2 |
{ // limit the scope of y
Argument y;
Foo(test ? x : y);
}
|
Foo(test ? x : Argument());
|
3 |
Foo(x);
|
Foo(test ? x : x);
|
4 |
Foo(x);
|
Foo(true ? x : Argument());
|
Edit: what I meant by the curly braces in Question 2 is that you shouldn’t consider “y
is now a defined variable” to be a significant difference between the two snippets.
The answers are worse than you'd think. →