在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
答案 0 :(得分:9)
是的,代码
for (/* .. */; /* .. */; q++, t += expression)
合法且应执行代码t += expression
。这使用了C的逗号运算符,这是一个鲜为人知的运算符,它几乎只在这种情况下使用。逗号运算符的工作原理是写
A, B;
A
和B
是表达式,按顺序评估A
和B
,然后生成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个表达不等同。