我如何把两个增量语句放在C ++的'for'循环中?

我想在for -loop条件而不是一个增加两个variables。

所以像这样:

 for (int i = 0; i != 5; ++i and ++j) do_something(i, j); 

这是什么语法?

一个常见的习惯用法是使用逗号运算符来计算两个操作数,并返回第二个操作数。 从而:

 for(int i = 0; i != 5; ++i,++j) do_something(i,j); 

但是它真的是一个逗号运算符吗?

现在写了这个,一个评论者提出,它实际上是for语句中的一个特殊的语法糖,而不是一个逗号操作符。 我检查了在海湾合作委员会如下:

 int i=0; int a=5; int x=0; for(i; i<5; x=i++,a++){ printf("i=%da=%dx=%d\n",i,a,x); } 

我期待x拿起a的原始值,所以它应该已经显示5,6,7 ..为x。 我得到的是这个

 i=0 a=5 x=0 i=1 a=6 x=0 i=2 a=7 x=1 i=3 a=8 x=2 i=4 a=9 x=3 

但是,如果我使用expression式来强制parsing器真的看到一个逗号运算符,我就可以得到这个

 int main(){ int i=0; int a=5; int x=0; for(i=0; i<5; x=(i++,a++)){ printf("i=%da=%dx=%d\n",i,a,x); } } i=0 a=5 x=0 i=1 a=6 x=5 i=2 a=7 x=6 i=3 a=8 x=7 i=4 a=9 x=8 

起初,我认为这表明它不是一个逗号运算符,但事实certificate这只是一个优先问题 – 逗号运算符具有尽可能低的优先级 ,所以expression式x = i ++,a ++是有效的parsing为(x = i ++),a ++

感谢所有的评论,这是一个有趣的学习经验,我已经使用C多年了!

尝试这个

 for(int i = 0; i != 5; ++i, ++j) do_something(i,j); 

尽量不要这样做!

来自~bs/JSF-AV-rules.html

AV规则199
for循环中的增量expression式除了将单个循环参数更改为循环的下一个值外,不会执行任何操作。

理由:可读性。

 for (int i = 0; i != 5; ++i, ++j) do_something(i, j); 

我来这里是为了提醒自己如何编写FOR循环的增量子句中的第二个索引,我知道这主要是通过一个样本来完成的,这个样本被整合到另一个使用C ++编写的项目中。

今天,我正在使用C#,但是我确信它会遵守这方面的相同规则,因为FOR语句是所有编程中最古老的控制结构之一。 值得庆幸的是,我最近花了好几天的时间精确地logging了我的一个老C程序中的FOR循环的行为,我很快意识到这些研究的经验教训适用于今天的C#问题,特别是第二个索引variables。

以下是对我的观察的总结。 通过仔细观察Locals窗口中的variables,我今天看到的所有事情都证实了我对C#FOR语句的行为与C或C ++ FOR语句完全相同的期望。

  1. 第一次执行FOR循环时,会跳过增量子句(它的三个三)。 在Visual C和C ++中,增量是在执行循环的块的中间以三条机器指令的forms生成的,所以初始遍只运行一次初始化代码,然后跳过增量块执行终止testing。 这实现了FOR循环执行零次或多次的function,具体取决于其索引和限制variables的状态。
  2. 如果循环的主体执行,它的最后一个语句是跳转到第一次迭代跳过的三个增量指令中的第一个。 这些执行后,控制自然落入实现中间语句的极限testing代码。 该testing的结果决定执行FOR循环的主体,还是控制转移到下一个跳过其下一个跳转指令的指令。
  3. 由于控制从FOR循环块的底部转移到增量块,所以在执行testing之前,索引variables会增加。 这种行为不仅解释了为什么您必须按照您学习的方式编写限制条款,而且还影响您通过逗号运算符添加的任何辅助增量,因为它成为第三个子句的一部分。 因此,它在第一次迭代中没有改变,但是在最后一次迭代中,它从不执行主体。

如果任何一个索引variables在循环结束时保持在范围内,那么在真实索引variables的情况下,它们的值将比停止循环的阈值高一个。 同样,例如,如果第二个variables在进入循环之前被初始化为零,那么它在最后的值将是迭代计数,假设它是一个增量(++),而不是一个递减,并且没有循环的主体改变了它的值。

我同意squelart。 增加两个variables是容易出错的,特别是如果你只testing其中的一个。

这是做到这一点的可读方式:

 for(int i = 0; i < 5; ++i) { ++j; do_something(i, j); } 

For循环意味着你的循环在一个递增/递减variables上运行的情况。 对于任何其他variables,请在循环中进行更改。

如果你需要j绑定到i ,为什么不保留原来的variables,并添加i

 for(int i = 0; i < 5; ++i) { do_something(i,a+i); } 

如果你的逻辑更复杂(例如,你需要实际监控多个variables),我会使用一个while循环。

 int main(){ int i=0; int a=0; for(i;i<5;i++,a++){ printf("%d %d\n",a,i); } } 

使用math。 如果这两个操作在math上取决于循环迭代,为什么不做math呢?

 int i, j;//That have some meaningful values in them? for( int counter = 0; counter < count_max; ++counter ) do_something (counter+i, counter+j); 

或者,更具体地参考OP的例子:

 for(int i = 0; i != 5; ++i) do_something(i, j+i); 

特别是如果你通过价值传递一个函数,那么你应该得到一些你想要的东西。