为什么三元运算符不支持块?

Ins*_*der 3 c ternary-operator language-lawyer

为什么三元运算符没有块?换句话说,为什么以下代码不起作用并报告{}大括号错误?

int main()
{
    int i = 1;
    (i==1)?{printf("Hello\n")}:{printf("World\n")};
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编辑

也许这个问题被误解了.原因是:为什么不支持块?为什么只有单一表达?

为什么不允许这样做?

int main()
{
    int i = 1;
    (i==1)?{printf("Hello\n");printf("World\n");}:{printf("Bye\n");printf("World\n");};
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

一个原因可能是三元通常用于左侧的条件赋值,而块将没有这样的返回,或者它会与块内的多个语句混淆.

Sou*_*osh 10

引用C11标准,章节§6.5.15,条件运算符的语法是

conditional-expression:
    logical-OR-expression
    logical-OR-expression ? expression : conditional-expression
Run Code Online (Sandbox Code Playgroud)

其中,第二和第三个操作数是expression,而不是声明.

只是详细说明,

下面的其中一个应该适用于第二个和第三个操作数:
- 两个操作数都有算术类型;
- 两个操作数具有相同的结构或联合类型;
- 两个操作数都有空洞类型;
- 两个操作数都是兼容类型的限定或非限定版本的指针;
- 一个操作数是指针,另一个是空指针常量; 或
- 一个操作数是指向对象类型的指针,另一个操作数是指向合格或非限定版本的void的指针.


编辑:

回答这个问题

为什么只有单一表达?

再次引用标准,

....结果是第二个或第三个操作数的值(无论哪个被评估),转换为下面描述的类型.

声明块,不会给出价值.评估一个expression罐头.


Vla*_*cow 5

三元运算符由表达式组成。不存在这样一种使用大括号的表达式。

你可以简单地写

( i == 1 ) ? printf("Hello\n") : printf("World\n");
Run Code Online (Sandbox Code Playgroud)

表达式中可以出现大括号的唯一情况似乎是使用复合文字。例如

struct A { int x; int y; } a = { 1, 2 };

a = a.x < a.y ? ( struct A ){ a.y, a.x } : ( struct A ){ ++a.x, --a.y }; 
Run Code Online (Sandbox Code Playgroud)

至于这个说法

(i==1)?{printf("Hello\n");printf("World\n");}:{printf("Bye\n");printf("World\n");};
Run Code Online (Sandbox Code Playgroud)

那么可以使用逗号运算符将其重写为以下方式

i == 1 ? ( printf("Hello\n"), printf("World\n") ) : ( printf("Bye\n"), printf("World\n") );
Run Code Online (Sandbox Code Playgroud)

或者甚至喜欢

i == 1 ? printf("Hello\n"), printf("World\n") : ( printf("Bye\n"), printf("World\n") );
Run Code Online (Sandbox Code Playgroud)

如果您需要代码块,请简短回答您的问题,然后使用该if-else语句而不是三元运算符。尽管该if-else语句不能在表达式中使用。另一方面,为了代码的可读性,表达式不要太复杂。

与任何运算符一样,三元运算符在表达式中使用并返回一些计算值。例如,作为表达式,它可以用作初始值设定项或赋值。