这是什么语法?

Moe*_*oeb 3 c syntax variable-assignment

i = 1, 2, 3, 4, 5;
Run Code Online (Sandbox Code Playgroud)

这实际上是指定1i.

*****我想知道这种类型的赋值在某个地方是否真的有用吗?*****

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

Jar*_*Par 15

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

for ( i = 0, j = 0; i < 10 && j < 10; i++ ) {
  ..
}
Run Code Online (Sandbox Code Playgroud)

  • 这可能是我使用过这种语法的唯一情况.每当我在其他地方看到它时,我都会畏缩. (2认同)

Chr*_*utz 14

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

(i = 1), (2), (3), (4), (5);
Run Code Online (Sandbox Code Playgroud)

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

i = 2, j = 3, k++;
Run Code Online (Sandbox Code Playgroud)

可以避免使用括号括起来if()(也可能导致后来的麻烦)或者允许你在for()循环的控制流中有多个表达式(这实际上是逗号运算符的合法使用).

  • @Benji - 对于一个已经令人困惑的逗号运算符而言,这是令人困惑的事情之一.那些逗号不是运营商; 它们是初始声明者列表中多个声明符的C语法所需的分隔符.其他非运算符的逗号包括分隔函数参数/参数的逗号和在定义枚举时分隔枚举的逗号.可能还有其他人. (2认同)

caf*_*caf 6

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

while (c = getchar(), c != EOF && c != '\n')
{
Run Code Online (Sandbox Code Playgroud)


Ste*_*sop 5

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

((((i = 1), 2), 3), 4), 5;
Run Code Online (Sandbox Code Playgroud)

void上下文中的整数文字是无用的(除了可能用于避免宏在某些情况下什么都不做的警告,比如assert),所以不,对于这种语法没有用处 - 需要一个表达式,它将i设置为1并计算为5是相当有限的,即使你找到了一个案例,2,3,4是多余的.

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