c循环输入

时间:2010-08-02 17:31:41

标签: c while-loop

有人请解释我为什么

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--;
}

给出一个无限循环?

感谢和问候

4 个答案:

答案 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,它作为任何实际目的的无限循环 - 我很确定我会在它希望以任何速度完成之前很久就会死掉。 ..