这是什么语法?

时间:2009-11-05 20:55:53

标签: c syntax variable-assignment

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

这实际上会将1分配给i

*****我想知道这种类型的作业在某处确实有用吗?*****

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

9 个答案:

答案 0 :(得分:15)

当你想在for循环中说出2个迭代变量

时,这个语法非常有用
for ( i = 0, j = 0; i < 10 && j < 10; i++ ) {
  ..
}

答案 1 :(得分:14)

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

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

如果您想在该行上执行其他操作,这可能是“有用的”:

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

可以避免使用if()语句的括号(以后可能会导致头痛)或允许您在for()循环的控制流中使用多个表达式(这实际上是非常合理的用法)逗号运算符)。

答案 2 :(得分:6)

应用程序:Obfuscated C Contest

答案 3 :(得分:6)

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

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

答案 4 :(得分:5)

这不是“任务类型”。逗号运算符绑定非常松散,比赋值松散。所以你写了相当于:

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

void上下文中的整数文字是无用的(除了可以避免宏在某些情况下什么都不做的警告,比如assert),所以不,没有用于确切的语法 - 需要一个将i设置为1的表达式并且评估为5是非常有限的,即使你找到了一个案例,2,3,4也是多余的。

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

答案 5 :(得分:3)

这是comma operator,它允许您将多个表达式合并为一个。

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

for循环外,它通常不常用,并且不赞成使用它。

答案 6 :(得分:0)

在作业中,我无法想到这个特定的例子在哪里有用。

但是,您可以

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

它们将被视为单一陈述,并从左到右进行评估(根据C89)。

答案 7 :(得分:0)

正如其他人已经指出的那样:这个语句将i分配给i,然后计算2,然后是3,然后是4然后是5.然后语句的整体值为5(最后一个计算表达式)。

答案 8 :(得分:0)

当您想创建一个执行多项操作并返回类似函数的值时,这非常有用:

#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);
...