for循环的增量步骤中是否可以有多个语句?

时间:2011-02-25 03:36:32

标签: c for-loop

for循环的增量步骤中使用多个语句的代码是否合法,如此处所示?

for ( ... ; ... ; q++, t += expression)

当我尝试这个时,表达式t += expression似乎没有被执行,但是当我将t += expression放在for循环体中时,它运行正常。

供参考,这是我的代码:

代码如下所示:

for(/* irrelevant */; /* ... */; q++, t -= p[q][t])
{ /* do some dp... */}

// t do not change when I print it out.

第二版:

for(/* irrelevant */; /* ... */; q++)
{ 
  /* do some dp... */
  t -= p[q][t];
}

// t updates this time

3 个答案:

答案 0 :(得分:9)

是的,代码

for (/* .. */; /* .. */; q++, t += expression)

合法且应执行代码t += expression。这使用了C的逗号运算符,这是一个鲜为人知的运算符,它几乎只在这种情况下使用。逗号运算符的工作原理是写

A, B;

AB是表达式,按顺序评估AB,然后生成B的值。所以,例如,写作

int x = (1, 2);

x赋予值2,因为它是逗号表达式中的最后一个词。

在此for循环的上下文中,写入

q++, t += expression

代码将执行q++,然后执行t += expression,然后整个表达式计算为t的新值。但是,由于for循环丢弃循环体中第三个表达式的值,因此不会在任何地方使用此值。

答案 1 :(得分:3)

for(;;)的第三部分中的代码在循环体之后执行。这是问题吗?

答案 2 :(得分:2)

您的2个示例中反映了评估顺序

for(/* irrelevant */; /* ... */; q++, t -= p[q][t])
{ /* do some dp... */}

// t do not change when I print it out.
}

将在q++之前执行t -= p[q][t],因此q的后续版本将用于索引。

for(/* irrelevant */; /* ... */; q++)
{ 
   /* do some dp... */
   t -= p[q][t]; 
}

在这种情况下,t -= p[q][t]将在q++之前执行,索引q在您的示例中不同。

你的2个表达不等同。