C语言中的三目运算符和返回

29

为什么不能在 C 语言的三目运算符中使用 return 关键字,就像这样:

sum > 0 ? return 1 : return 0;

20
return sum > 0 ? 1 : 0;有什么问题? - Paul Tomblin
2
或者说,如果(sum > 0)返回1;否则返回0; - Pascal Cuoq
13
或者说,return sum > 0;呢? - CB Bailey
3
因为a ? b : c是一个包含表达式而非语句的表达式,而return d是一条语句而非表达式。 - cmaster - reinstate monica
3
因为它是一个操作符,而不是一个“if”语句。 - Lundin
显示剩余2条评论
8个回答

43

return是一个语句,不能以那种方式在表达式内使用。


36

三元运算符是一个表达式,而在表达式中不能使用语句。

不过你可以在返回语句中轻松使用三元运算符。

return sum > 0 ? 1 : 0;

或者像DrDipShit指出的那样:

return sum > 0;

11
“of just: return sum > 0; which works out as returning 1 or 0 anyway.” 的翻译是:“仅仅是返回 sum 是否大于 0;这实际上等同于返回 1 或 0。” - Ultimate Gobblement
@DrDipShit:非常正确,在这种情况下,它同样有效 :) - Wolph

15

三元运算符处理表达式,但return是一个语句。

return语句的语法为

return expr ;

三元条件运算符的语法为

expr1 ? expr2 : expr3

因此,您可以将三元运算符的调用插入作为return语句中的expr。但是,您不能将return语句作为三元运算符的expr2expr3插入其中。

三元表达式的行为很像if语句,但它并不是if语句的完全替代。如果您想要编写

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

您可以将其编写为真正的if语句,但是如果要使用? :,则需要稍微重新排列一下,就像我们在这里看到的那样。


9

因为return是一个语句,而不是表达式。你也不能这样写:int a = return 1;


2
< p > return语句用于从function中返回,不能在三元运算符中使用。
 (1==1)? return 1 : return 0; /* can't use return inside ternary operator */

你可以将它制作成这样。
return (1==1) ? 1 : 0;

三元运算符的语法如下:
expr1 ? expr2 : expr3;

其中expr1expr2expr3是表达式,return是语句而不是表达式。


2

三元运算符的语法为:

expr1 ? expr2: expr3;

其中expr1expr2expr3是表达式;

?:运算符的工作方式如下:如果expr1为真,则首先评估expr1,否则评估expr3

因此,在C语言中,表达式中不能使用return语句。


1
你可以使用gcc/clang的语句表达式特性。
#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);
}

结果如下:
$ ./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;

0

仅从语法上看,您应该知道语句不能用于表达式中。 您想要的可以通过以下方式实现:return sum > 0 ? 1 : 0;


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接