繁体   English   中英

这是什么语法?

[英]What is this syntax?

i = 1, 2, 3, 4, 5;

这实际上将1分配给i

*****我想知道这种作业在某处是否真的有用吗?*****

您知道这种语法的一些应用吗?

当您想在for循环中说2个迭代变量时,此语法非常有用

for ( i = 0, j = 0; i < 10 && j < 10; i++ ) {
  ..
}

它是逗号运算符,C的最低优先级运算符。 根据C的优先级规则,该行解析为:

(i = 1), (2), (3), (4), (5);

如果您想在那条线上做其他事情,这可能是“有用的”:

i = 2, j = 3, k++;

可以使您不必在if()语句中使用方括号(并且以后可能还会引起头痛),或者使您可以在for()循环的控制流中使用多个表达式(实际上是对逗号运算符的合理使用)。

应用: 混淆C竞赛

逗号运算符的另一个常见用法是在while循环条件下:

while (c = getchar(), c != EOF && c != '\n')
{

这不是一种“任务类型”。 逗号运算符的绑定非常宽松,比赋值更宽松。 因此,您编写了等效于:

((((i = 1), 2), 3), 4), 5;

void上下文中的整数文字是无用的(可能是为了避免在某些情况下(例如assert)在某些情况下不执行任何操作的宏中发出警告),因此不,这种语法没有用-需要将i设置为1并计算为5是非常有限的,即使您找到了理由,2,3,4也是多余的。

更有用的可能是i = 1, code_that_actually_does_something; 逗号运算符最常见的用法是在不允许您使用多个语句(例如“ if”和“ while”条件)或必须作为表达式求值的宏的上下文中潜入多种副作用。

这是逗号运算符 ,它允许您将多个表达式组合为一个。

编译器将其解析为(i = 1), 2, 3, 4, 5 ,因为=具有比逗号运算符更高的优先级。

除了在for循环中,它通常没有用,并且它的使用被皱眉了。

在作业中,我想不出这个特定示例在什么地方有用。

您可以,但是

x = 1, y = 2, z = 3;

并且它们将被视为单个语句,并从左到右进行评估(根据C89)。

正如其他人已经指出的那样:该语句将1赋给i,然后求值2,然后是3,然后是4,然后是5。然后,该语句的总值为5(最后一个求值的表达式)。

当您要创建一个可以完成多项工作并返回诸如函数之类的值的宏时,这很有用:

#define STEAL_MAGIC_HAT(thing1, thing2, cat) \
(smack(thing1), punch(thing2),get_hat(cat))

extern thing_t g_thing1, g_thing2;
extern cat_t g_cat;
...

    hat_t hat = STEAL_MAGIC_HAT(g_thing1, g_thing2, g_cat);
    don(hat);
...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM