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

  • Thread starter Thread starter Raghav Gupta
  • Start date Start date
  • Tags Tags
    C++ Operator
Click For Summary
The ternary operator in C++ is a shorthand conditional expression that allows for concise inline decision-making. It follows the syntax (condition ? ifTrue : ifFalse) and can replace simple if-else statements, enhancing code compactness. For example, the expression return (i == 10) ? 5 : 1 functions identically to a traditional if-else block. While it is often used for straightforward return statements or to simplify function parameters, such as in printfString, opinions on its use vary. Some argue that it can lead to hard-to-read code when overused or misapplied, particularly in complex expressions or as an lvalue. Others contend that, when used judiciously, it improves code clarity and efficiency. The discussion highlights the importance of context and readability in deciding whether to use the ternary operator, suggesting that it should not be outright banned but applied thoughtfully.
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?
 
Technology 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 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:

Similar threads

  • · Replies 22 ·
Replies
22
Views
2K
  • · Replies 23 ·
Replies
23
Views
3K
  • · Replies 13 ·
Replies
13
Views
3K
  • · Replies 5 ·
Replies
5
Views
3K
  • · Replies 4 ·
Replies
4
Views
1K
  • · Replies 12 ·
Replies
12
Views
4K
  • · Replies 22 ·
Replies
22
Views
3K
  • · Replies 8 ·
Replies
8
Views
2K
  • · Replies 9 ·
Replies
9
Views
3K
  • · Replies 15 ·
Replies
15
Views
8K