我想在for
-loop条件下增加两个变量,而不是一个。
所以像这样:
for (int i = 0; i != 5; ++i and ++j)
do_something(i, j);
这是什么语法?
Answers:
一个常见的习惯用法是使用逗号运算符,该运算符对两个操作数求值,然后返回第二个操作数。从而:
for(int i = 0; i != 5; ++i,++j)
do_something(i,j);
写完这些之后,评论者建议它实际上是for语句中的一些特殊语法糖,而不是逗号运算符。我在GCC中进行了如下检查:
int i=0;
int a=5;
int x=0;
for(i; i<5; x=i++,a++){
printf("i=%d a=%d x=%d\n",i,a,x);
}
我期望x能够拾取a的原始值,所以它应该已经为x显示了5,6,7..。我得到的是这个
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
但是,如果我将表达式放在方括号中以强制解析器真正看到逗号运算符,则会得到此提示
int main(){
int i=0;
int a=5;
int x=0;
for(i=0; i<5; x=(i++,a++)){
printf("i=%d a=%d x=%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
最初,我认为这表明它根本不表现为逗号运算符,但事实证明,这只是一个优先级问题-逗号运算符的优先级最低,因此表达式x = i ++,a ++有效解析为(x = i ++),a ++
感谢所有评论,这是一次有趣的学习经历,我已经使用C多年了!
试试这个
for(int i = 0; i != 5; ++i, ++j)
do_something(i,j);
for( ; ; ((++i), (++j)) )
for(int i = 0; i != 5; (++i)) {
多余的括号使编译器认为它不再是“递增”操作。
尽量不要这样做!
从http://www.research.att.com/~bs/JSF-AV-rules.pdf:
AV规则199
for循环中的增量表达式除了将单个循环参数更改为该循环的下一个值外,将不执行任何操作。理由:可读性。
我来这里是为了提醒自己如何将第二个索引编码到FOR循环的增量子句中,我知道主要可以通过观察并结合到另一个用C ++编写的项目中的示例来完成。
今天,我在C#中工作,但是我确信在这方面它将遵循相同的规则,因为FOR语句是所有编程中最早的控制结构之一。值得庆幸的是,我最近花了几天的时间来精确地记录一个较旧的C程序中的FOR循环的行为,然后我很快意识到那些研究吸取了适用于当今C#问题(尤其是第二个索引变量的行为)的课程。 。
对于粗心的人,以下是我的观察总结。通过仔细观察Locals窗口中的变量,我今天看到的所有事情都证实了我的期望,即C#FOR语句的行为与C或C ++ FOR语句完全一样。
如果在循环结束时您的任何一个索引变量仍在作用域内,则对于真正的索引变量,它们的值将比停止循环的阈值高一个。同样,例如,如果第二个变量在进入循环之前被初始化为零,则它的末尾值将是迭代计数,假设它是一个增量(++),而不是一个减量,并且在其中没有任何值循环的主体会更改其值。
我同意squelart。增加两个变量很容易发生错误,特别是如果仅测试其中之一。
这是执行此操作的可读方法:
int j = 0;
for(int i = 0; i < 5; ++i) {
do_something(i, j);
++j;
}
For
循环适用于循环在一个递增/递减变量上运行的情况。对于任何其他变量,请在循环中进行更改。
如果需要j
绑定i
,为什么不保留原始变量并添加i
?
for(int i = 0; i < 5; ++i) {
do_something(i,a+i);
}
如果您的逻辑更为复杂(例如,您实际上需要监视多个变量),则可以使用while
循环。
int main(){
int i=0;
int a=0;
for(i;i<5;i++,a++){
printf("%d %d\n",a,i);
}
}
i
和a
局部循环的意义何在?
使用数学。如果这两个运算在数学上取决于循环迭代,那么为什么不进行数学运算呢?
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);
尤其是如果您要按值传递函数,那么您应该得到完全符合您想要的功能的东西。