Understanding the Ternary Operator in C++: How and When to Use It?

  • Context: C/C++ 
  • Thread starter Thread starter Raghav Gupta
  • Start date Start date
  • Tags Tags
    C++ Operator
Join the discussion
Registration is free. Ask a follow-up in this thread, or start your own.
6 replies · 2K views
Raghav Gupta
Messages
1,010
Reaction score
76
Member warned about posting questions that could be easily answered in a web search
What is ternary operator in c++ and its use?
 
Physics news on Phys.org
It's used as a switch.

Code:
if (i == 10){
    return 5;
} else {
    return 1;
}

Is functionally the same as

Code:
return (i == 10) ? 5 : 1

The ? : set is the ternary operator: (bool ? ifTrue : ifFalse) will resolve to either ifTrue or ifFalse depending on the value of bool.

It's used for shorthand, or for a case where you want to alter the behavior of something based on something else inline. Practical example:
Code:
void printfString(const char * format, const char * str){
    printf(format, (str == NULL ? "NULL" : str));
}
 
Have you used google?

First result with some pitfalls: http://www.cplusplus.com/forum/articles/14631/

It's usually applied in simple return statements.

for example this is how you could implement a max-function

C:
double fmax( double a, double b){
   return (a > b) ? a : b;
}

I would generally avoid using the ternary operation.
It can make your code hard to read.

Edit:
Too slow :)
 
JorisL said:
I would generally avoid using the ternary operation.
It can make your code hard to read.

I so disagree. When used to excess or otherwise inappropriately, the ternary operator does indeed make ones code hard to read. However, when used correctly, the ternary operator makes ones code much more compact and much easier to read.

I have an ongoing disagreement with a vice president of the company I work for regarding the ternary operator. Yes, the ternary operator most certainly can be used in a way that can make ones code a good candidate for the IOCCC (the International Obfuscated C Code Contest). But then again, so can the dot operator:
Code:
// Don't do this.
foo().bar->baz(qux)->quux.quuux->quuuux();
Note well: The above violates the law of Demeter, aka the "don't talk to strangers" rule.

The easy rule is to ban the use of the dot operator, but nobody does that. So why are so many people so willing to ban the use of the ternary operator just because it can, when used to excess, make code hard to read?

The right rule, to me, is
  • Never use the ternary operator as an lvalue.
    Code:
    // Don't do this.
    (set_a ? a : b) = 42;
  • Don't chain the ternary operator.
    Code:
    // Don't do this.
    x = condition_a ?
      (condition_b ?
        (condition_c ? 0 : 1) : (condition_d ? 2 : 3)) ?
      (condition_e ? 4 : 5);
  • If it makes more sense to use an if statement, do so.
    Code:
    // I can't think of a good example. I like the ternary operator.
  • If it makes more sense to use the ternary operator, do so!
    Code:
    //Do this!
    std::cout << (success ? "Success!" ? "Failure.") << '\n';
 
Last edited:
  • Like
Likes   Reactions: newjerseyrunner and jim mcnamara
D H said:
Never use the ternary operator as an lvalue.
Code:
// Don't do this.
(set_a ? a : b) = 42;

That's actually illegal unless both a and b are references, this would be the proper way to write that.
Code:
set_a ? (a = 42) : (b = 42);
But yeah, that's awful code.
 
So I checked it out again in one of my books.
It gave some more examples and I agree, the notation is practical.

I guess it's a remnant of studying code only in my early teens.
A lot of resources strictly warned against, probably because they didn't want to write a longer post.
 
newjerseyrunner said:
That's actually illegal unless both a and b are references, this would be the proper way to write that.
It is totally legal in C++, even if they aren't references. (The ternary operator in C isn't quite that powerful.)

Live demo: https://ideone.com/O7csXR

But just because it's legal doesn't mean you should use it.
 
Last edited: