Conditional Operator

You might be a ThreeStarProgrammer if you use the ternary conditional operator ?: in CeeLanguage or JavaLanguage or PerlLanguage. Especially if you used it as an LValue.

You have used ?: to avoid writing an if statement.

This is a useful technique when instrumenting code for profiling:

 if(x)
 {
 }
 else
 {
 }

becomes:

 if((x) ? 
TRACE(1),1 :  // executed when (x) is true,  continues into "if" block
TRACE(2),0)// executed when (x) is false, continues into "else" block 
 {
 }
 else
 {
 }

In this context the technique doesn't interfere with the block code if the original didn't use brackets, and the conditional is still evaluated OnceAndOnlyOnce, so it won't cause macro-expansion problems. I consider this usage to be a special case; I'd discourage regularly using ? in place of if-else.

Ummm...this technique doesn't work Consider this simplification:

if (x? foo(),1: bar(),0) { ... }
Because ? and : are brackets, there is no binding problem with the first comma. However, comma has lower precedence than ?:, so this statement should be parsed as

if ((x? (foo(), 1): bar()), 0) { ... }
which implies that the { ... } will never be executed.

I am leaving the original suggestion uncorrected because I think it's a useful lesson. --AndrewKoenig


I'd like to add another use of ?: that can make mathematically based code much easier to read. Guards in languages like HaskellLanguage are an immensely useful feature and ?: can be used to implement them in C/C++.

  const double a =
expression1? a1
: expression2? a2
: expression3? a3
: /*otherwise*/a4;

Compare this to the equivalent if statements version which is more error prone and procedural instead of the mathematical declarative form. Also note that in the above code a can be declared as const as we intended it.

  double a;
  if( expression1 )
a = a1;
  else if( expression2 )
a = a2;
  else if( expression3 )
a = a3;
  else /*otherwise*/
a = a4;

Like anything else ?: can be abused, but used well it can produce better code. --DavidSankel?


PythonLanguage 2.4 and below had no official ternary conditional, but it could be emulated with short-circuiting and/or:

 a = p and t or f

However, this is not a perfect solution because, for this to behave the same as the conditional operator, t must not evaluate to False. If it does, the "and" test will fail and the expression will evaluate to f, regardless of the value of p.

Python 2.5 introduced a true conditional operator with the following syntax:

 a = t if p else f


LispLanguage and many others simply use if-then-else or cond, since they are already expressions.


As pointed out in the introductory paragraph, it is possible (though generally discouraged) to use the ternary operator as a LeftValue selector:

 ((foo) ? bar : baz) = frink;

which is equivalent to:

 if (foo)
bar = frink;
 else
baz = frink;

Defenders of the device hold that it makes the intention of a selected assignment clear, but the vast majority of programmers consider this extremely poor style, if only because the technique's obscurity. (Personally, I have a certain fondness for it, but then I'm a manic Lisp weenie; I would never use it in anything anyone else would ever have to maintain, however, unless I intended it as EvilCode. -- JayOsako)

The same thing can be done with function calls: foo = (bar ? baz : quux)(frink)

Using ?: in lvalues are not supported in C, but you can still do this:

 *(foo?&bar:&baz)=frink;


A good use for the conditional operator is when you have code like this:

 if (a)
     f(b);
 else
     f(c);

It can be re-written as:

 f( a ? b : c);


See also ChoiceOperatorDoesNotConsiderInheritance


EditText of this page (last edited April 17, 2010) or FindPage with title or text search