有人请解释我为什么
int i=0,j=10;
while(j>0,i++){
printf("%d%d",i,j);
j--;
}
不起作用
int i=0,j=10;
while(i++,j>0){
printf("%d%d",i,j);
j--;
}
作品。
另请告诉我原因
int i=0,j=10;
while(j>0,++i){
printf("%d%d",i,j);
j--;
}
给出一个无限循环?
感谢和问候
戒
答案 0 :(得分:16)
在while循环条件中,使用逗号运算符,它会计算其参数并返回第二个参数。所以在你的例子中:
while(j>0,i++) - returns i before it gets incremented;
that is 0, so loop won't execute at all
while(i++,j>0) - returns (j > 0) - runs as expected
while(j>0,++i) - returns i - will run until i overflows max int value
答案 1 :(得分:4)
阅读C comma operator。基本上它归结为逗号运算符返回逗号右侧的结果 - 所以在第一个例子中,i ++返回0,循环结束。在第三种情况下,++ i永远不会为0(至少不会持续很长时间),因此您将获得无限循环。中间的情况是可以的,因为j>0
的结果是从逗号运算符返回的,并且你的循环按预期工作。
答案 2 :(得分:1)
您正在使用逗号运算符。逗号运算符的结果是第二个子表达式。因此j>0,i++
评估为i++
。 i++
最初为0,因此循环永远不会执行。
同样地,j>0,++i
计算为++i
,在你溢出之前它将为非零,所以它似乎永远循环(虽然真的很长一段时间)。
i++,j>0
有效,因为last-subexpression是j>0
,这是您想要的实际条件。请注意,即使逗号运算符抛弃了第一个表达式的结果(在这种情况下为i++
),它仍然会计算该子表达式,因此您仍然会产生副作用(递增i
)。
答案 3 :(得分:0)
在这些情况下,您有包含逗号运算符的表达式。逗号运算符计算其左操作数,然后计算其右操作数。结果是右操作数。
目前,我们只考虑您的上一个问题:
int i=0,j=10;
while(j>0,++i){
printf("%d%d",i,j);
j--;
}
这不应该是一个无限循环,尽管它可能只比位运行的时间长于预期。由于逗号运算符的结果是 right 操作数的结果,因此等待++i
变为0.因为它从0开始,所以它将循环 all int
在终止之前的可能值。使用16位int
,可能需要几分钟。使用32位int
,它会使相当更长一些。对于64位int
,它将作为任何实际目的的无限循环 - 我很确定我会在它希望以任何速度完成之前很久就会死掉。 ..