在for循环的增量步骤中使用具有多个语句的代码是否合法,如此处所示?
for ( ... ; ... ; q++, t += expression)
Run Code Online (Sandbox Code Playgroud)
当我尝试这个时,表达式t += expression似乎没有被执行,但是当我放入t += expressionfor循环体时,它工作正常.
作为参考,这是我的代码:
代码如下所示:
for(/* irrelevant */; /* ... */; q++, t -= p[q][t])
{ /* do some dp... */}
// t do not change when I print it out.
Run Code Online (Sandbox Code Playgroud)
第二版:
for(/* irrelevant */; /* ... */; q++)
{
/* do some dp... */
t -= p[q][t];
}
// t updates this time
Run Code Online (Sandbox Code Playgroud)
是的,代码
for (/* .. */; /* .. */; q++, t += expression)
Run Code Online (Sandbox Code Playgroud)
是合法的,应该执行代码t += expression.这使用了C的逗号运算符,这是一个鲜为人知的运算符,在这种情况下几乎完全使用它.逗号运算符的作用就是写作
A, B;
Run Code Online (Sandbox Code Playgroud)
在哪里A和B是表达式,评估两者A和B按顺序,然后产生值B.所以,例如,写作
int x = (1, 2);
Run Code Online (Sandbox Code Playgroud)
将赋予x值2,因为它是逗号表达式中的最后一个术语.
在这个for循环的上下文中,写作时
q++, t += expression
Run Code Online (Sandbox Code Playgroud)
代码将执行q++,然后执行t += expression,然后整个表达式求值为新值t.但是,由于for循环丢弃循环体中第三个表达式的值,因此不会在任何地方使用此值.