Posts tagged ‘ternary’

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?

## C++ is bad: problems with the ternary operator

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.