一个常见的习惯用法是使用逗号运算符它计算两个操作数,并返回第二个操作数。因此:
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 多年了!