views:

150

answers:

5

I wrote the absolute function using ternary operator as follows

int abs(int a) {
 a >=0 ? return a : return -a;
}

I get the following error messages

../src/templates.cpp: In function ‘int abs(int)’:
../src/templates.cpp:4: error: expected primary-expression before ‘return’
../src/templates.cpp:4: error: expected ‘:’ before ‘return’
../src/templates.cpp:4: error: expected primary-expression before ‘return’
../src/templates.cpp:4: error: expected ‘;’ before ‘return’
../src/templates.cpp:4: error: expected primary-expression before ‘:’ token
../src/templates.cpp:4: error: expected ‘;’ before ‘:’ token
../src/templates.cpp:5: warning: no return statement in function returning non-void

If I write like this

return a>=0 ? a : -a;

I don't get any error. What's the difference between the two?

+3  A: 

Return is a statement and cannot be used where a value is expected.

You must use expressions (which usually yield a value) in the three components of the ternary operator.

Jonathan Leffler
+10  A: 

The second and third arguments to the ternary operator are expressions, not statements.

 return a

is a statement

Paul
The first argument to the ternary operator is also an expression, of course. The latter two might be expressions of type `void`, though.
Jonathan Leffler
Yes, it's just that the OP's issue was with the last two...
Paul
+2  A: 

?: is an operator that takes three expressions and evaluates them in some way to produce a result. return a is not an expression (it's a statement), so your first form doesn't work. It's the same as you can't put return in the arguments of other operators: return a + return b will also not work.

If you want the returns in the separate branches, use if instead:

if (a >=0)
   return a;
else
   return -a;
sth
+5  A: 

What's the difference between the two?

One is correct syntax, the other is not.

Gary Willoughby
+1 for stating the obvious :D
Vinzenz
A: 

Your syntax is incorrect. It should be

if (a >=0)
    return a;
else
    return -a;

or the way you wanted it:

return a >=0 ? a : -a;
Nandit Tiku