【发布时间】:2010-11-16 23:01:45
【问题描述】:
我想在for-loop 条件中增加两个变量而不是一个。
比如:
for (int i = 0; i != 5; ++i and ++j)
do_something(i, j);
这是什么语法?
【问题讨论】:
标签: c++ for-loop comma-operator
我想在for-loop 条件中增加两个变量而不是一个。
比如:
for (int i = 0; i != 5; ++i and ++j)
do_something(i, j);
这是什么语法?
【问题讨论】:
标签: c++ for-loop comma-operator
试试这个
for(int i = 0; i != 5; ++i, ++j)
do_something(i,j);
【讨论】:
for( ; ; ((++i), (++j)) )
for(int i = 0; i != 5; (++i)) { 额外的括号使编译器认为它不再是“增量”操作。
for (int i = 0; i != 5; ++i, ++j)
do_something(i, j);
【讨论】:
int main(){
int i=0;
int a=0;
for(i;i<5;i++,a++){
printf("%d %d\n",a,i);
}
}
【讨论】:
i 和a 设置为本地循环有什么意义?
一个常见的习惯用法是使用comma operator,它计算两个操作数,并返回第二个操作数。因此:
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 的原始值,所以它应该显示 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
但是,如果我将表达式括起来以强制解析器真正看到逗号运算符,我会得到这个
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
最初我认为这表明它根本不像逗号运算符,但事实证明,这只是一个优先级问题 - 逗号运算符具有lowest possible precedence,因此表达式 x=i++, a++ 被有效地解析为 (x=i++),a++
感谢所有 cmets,这是一次有趣的学习经历,而且我已经使用 C 多年了!
【讨论】:
尽量不要这样做!
来自http://www.research.att.com/~bs/JSF-AV-rules.pdf:
AV 规则 199
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 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);
特别是如果你通过值传递给函数,那么你应该得到一些完全符合你想要的东西。
【讨论】:
我来这里是为了提醒自己如何将第二个索引编码到 FOR 循环的增量子句中,我知道这可以主要通过在我合并到另一个项目中的示例中观察它来完成,该示例是用 C++ 编写的。
今天,我使用 C# 工作,但我确信它在这方面会遵守相同的规则,因为 FOR 语句是所有编程中最古老的控制结构之一。值得庆幸的是,我最近花了几天时间在我的一个较旧的 C 程序中精确记录 FOR 循环的行为,我很快意识到这些研究提供了适用于当今 C# 问题的经验,特别是第二个索引变量的行为.
对于粗心的人,以下是我的观察总结。通过仔细观察 Locals 窗口中的变量,我今天看到的一切都证实了我的预期,即 C# FOR 语句的行为与 C 或 C++ FOR 语句完全相同。
如果循环结束时您的任一索引变量仍在范围内,则在真正的索引变量的情况下,它们的值将比停止循环的阈值高一个。同样,例如,如果第二个变量在进入循环之前被初始化为零,那么它最后的值将是迭代计数,假设它是递增 (++),而不是递减,并且在循环体改变了它的值。
【讨论】: