Ternary operators and Return in C

Viewed 27716

Why can't we use return keyword inside ternary operators in C, like this:

sum > 0 ? return 1 : return 0;
8 Answers

The ternary operator deals in expressions, but return is a statement.

The syntax of the return statement is

return expr ;

The syntax of the ternary conditional operator is

expr1 ? expr2 : expr3

So you can plug in an invocation of the ternary operator as the expr in a return statement. But you cannot plug in a return statement as expr2 or expr3 of a ternary operator.

The ternary expression acts a lot like an if statement, but it is not an exact replacement for an if statement. If you want to write

if(sum > 0)
     return 1;
else return 0;

you can write it as a true if statement, but you can't convert it to using ? : without rearranging it a little, as we've seen here.

The return statement is used for returning from a function, you can't use inside ternary operator.

 (1==1)? return 1 : return 0; /* can't use return inside ternary operator */

you can make it like

return (1==1) ? 1 : 0;

The syntax of a ternary operator follows as

expr1 ? expr2 : expr3;

where expr1, expr2, expr3 are expressions and return is a statement, not an expression.

You can use gcc's/clang's statement expressions feature.

#include <stdio.h>

#define discard(value) ({return value; value;})

int foo(int a) {
        int b = a%2 ?: discard(0);
        return b*a;
}

int main(int argc, char argv) {
        printf("foo(%d) = %d;\n", argc, foo(argc));
        return foo(argc);
}

Results are:

$ ./bar 
foo(1) = 1;
$ ./bar 2
foo(2) = 0;
$ ./bar 2 3
foo(3) = 3;
$ ./bar 2 3 4
foo(4) = 0;
$ ./bar 2 3 4 5
foo(5) = 5;
$ ./bar 2 3 4 5 6
foo(6) = 0;
$ ./bar 2 3 4 5 6 7
foo(7) = 7;
$ ./bar 2 3 4 5 6 7 8
foo(8) = 0;
$ ./bar 2 3 4 5 6 7 8 9
foo(9) = 9;
$ ./bar 2 3 4 5 6 7 8 9 10
foo(10) = 0;
Related