2011-02-25 68 views
1

for循环的递增步骤中使用多个语句的代码是合法的,如下所示?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 
+1

你的实际代码是什么样的? – 2011-02-25 03:38:31

+0

加上...看看。 – 2011-02-26 04:49:06

回答

9

是,代码

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

是合法并应该执行代码t += expression。这使用C的逗号运算符,这是一个鲜为人知的运算符,它在这种情况下专用。逗号操作符等作品,写

A, B; 

AB是表达式,为了评估这两个AB,然后产生的B值。因此,例如,写

int x = (1, 2); 

会给x2,因为它是在逗号表达式中的最后一项。

在这种for循环的上下文写入

q++, t += expression 

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

+0

THX。但是,在逗号仍然按照你所说的执行之后,我仍然对代码感到困惑。但我没有改变我的循环... – 2011-02-26 04:54:05

+0

@ user616677-没有更多的信息,我不认为我可以帮你诊断问题。我所知道的是,声明确实会被执行。也许你正在改变其他地方的价值? – templatetypedef 2011-02-26 22:28:24

3

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

2

评价的顺序在你的两个例子是反转

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

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

t -= p[q][t]所以q的继任者将在索引中被使用之前执行q++

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

在这种情况下t -= p[q][t]q++之前,指数q是不是在你的例子一样被执行。

你的2个表达式不等价。

+0

大声笑....我没有注意到...非常感谢你.. – 2011-03-04 07:56:01