繁体   English   中英

c循环输入

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM