[英]c while loop entry
有人请解释我原因
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--;
}
给出一个无限循环?
谢谢并恭祝安康
戒
在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
阅读C 逗号运算符 。 基本上它归结为逗号运算符返回逗号右侧的结果 - 所以在第一个例子中,i ++返回0,循环结束。 在第三种情况下,++ i永远不会为0(至少不会持续很长时间),因此您将获得无限循环。 中间的情况是可以的,因为j>0
的结果是从逗号运算符返回的,并且你的循环按预期工作。
您正在使用逗号运算符。 逗号运算符的结果是第二个子表达式。 所以j>0,i++
评估为i++
。 i++
最初为0,因此循环永远不会执行。
同样, j>0,++i
计算到++i
,在你溢出之前它将是非零的,所以它似乎永远循环(虽然真的只是很长一段时间)。
i++,j>0
有效,因为last-subexpression是j>0
,这是你想要的实际条件。 请注意,即使逗号运算符抛弃了第一个表达式的结果(在这种情况下为i++
),它仍然会计算该子表达式,因此您仍然会得到副作用(递增i
)。
在这些情况下,您有包含逗号运算符的表达式。 逗号运算符计算其左操作数,然后计算其右操作数。 结果是右操作数的结果。
目前,让我们只考虑你的最后一个问题:
int i=0,j=10;
while(j>0,++i){
printf("%d%d",i,j);
j--;
}
这不应该真正无限循环,虽然它可能运行只是有点比预期更长。 由于逗号运算符的结果是右操作数的结果,因此等待++i
变为0.因为它从0开始,它将在终止之前循环通过int
所有可能值。 使用16位int
,可能需要几分钟。 随着32位int
,这将非常需要更长的时间。 使用64位int
,对于任何实际目的来说都是无限循环 - 我很确定我会在它希望以任何速度完成之前很久就会死掉......
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.