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
罐头.
三元运算符由表达式组成。不存在这样一种使用大括号的表达式。
你可以简单地写
( 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
语句不能在表达式中使用。另一方面,为了代码的可读性,表达式不要太复杂。
与任何运算符一样,三元运算符在表达式中使用并返回一些计算值。例如,作为表达式,它可以用作初始值设定项或赋值。