問題描述
我想在 for
循環條件中增加兩個變量而不是一個.
I would like to increment two variables in a for
-loop condition instead of one.
比如:
for (int i = 0; i != 5; ++i and ++j)
do_something(i, j);
這是什么語法?
推薦答案
一個常見的習慣用法是使用 逗號運算符 計算兩個操作數,并返回第二個操作數.因此:
A common idiom is to use the comma operator which evaluates both operands, and returns the second operand. Thus:
for(int i = 0; i != 5; ++i,++j)
do_something(i,j);
但它真的是逗號運算符嗎?
寫完之后,一位評論者認為它實際上是 for 語句中的一些特殊語法糖,根本不是逗號運算符.我在 GCC 中進行了如下檢查:
But is it really a comma operator?
Now having wrote that, a commenter suggested it was actually some special syntactic sugar in the for statement, and not a comma operator at all. I checked that in GCC as follows:
int i=0;
int a=5;
int x=0;
for(i; i<5; x=i++,a++){
printf("i=%d a=%d x=%d
",i,a,x);
}
我期望 x 獲取 a 的原始值,因此它應該為 x 顯示 5,6,7...我得到的是這個
I was expecting x to pick up the original value of a, so it should have displayed 5,6,7.. for x. What I got was this
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
但是,如果我將表達式括起來以強制解析器真正看到逗號運算符,我會得到這個
However, if I bracketed the expression to force the parser into really seeing a comma operator, I get this
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
",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++
Initially I thought that this showed it wasn't behaving as a comma operator at all, but as it turns out, this is simply a precedence issue - the comma operator has the lowest possible precedence, so the expression x=i++,a++ is effectively parsed as (x=i++),a++
感謝所有的評論,這是一次有趣的學習經歷,我已經使用 C 多年了!
Thanks for all the comments, it was an interesting learning experience, and I've been using C for many years!
這篇關于如何在 C++ 'for' 循環中放置兩個增量語句?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!