C语言while循环中的后加运算符

18

这里是一个非常简单的C语言程序:

int main()
{
    int i = 0;
    while(i++ < 10)
         printf("%d\n", i);

    return 0;
}

结果为:

1
2
3
4
5
6
7
8
9
10

为什么打印的第一个数字不是0? 如果我将i++替换为++i,会得到以下结果:

1
2
3
4
5
6
7
8
9

对于 i++++i, 第一个数都是 1
我在 while() 循环中期望看到后增量的 0
谢谢。


1
i++在执行时间中递增,当然是1。 - BernardoLima
无论使用哪个运算符,您都是在修改 i 之后打印它,那么您怎么能看到 0 呢?! - StoryTeller - Unslander Monica
1
while(i++ < 10) /*i is incremented here*/ printf("%d\n", i); - HolyBlackCat
2
C程序员似乎有些喜欢在SO上点踩,就好像C不是有史以来最令人困惑的语言一样。 - razz
5个回答

19

i++(和++i)是作为while表达式评估的一部分完成的,这发生在打印之前。这意味着它始终会最初打印1

i++++i变体之间仅在表达式本身内部进行增量时有所不同,并且这会影响最终打印的值。每个的等效伪代码如下:

while(i++ < 10)            while i < 10:
                               i = i + 1
    printf("%d\n", i);         print i
                           i = i + 1

并且:

                           i = i + 1
while(++i < 10)            while i < 10:
    printf("%d\n", i);         print i
                               i = i + 1

假设i变成了9。使用i++ < 10,它会在while表达式中使用9 < 10,然后再将i增加到10并打印出来。因此,检查使用9,然后打印10。

使用++i < 10,它首先将i增加1,然后使用10 < 10作为while表达式。因此,检查使用10,且因为循环已经因为该检查而退出,所以不会打印任何东西。


6

i++后置递增,而++i前置递增。 后置递增意味着在递增对象之后返回先前的值。 前置递增意味着在递增对象后返回递增后的值。 无论哪种方式,当表达式求值时,都会递增对象,这就是为什么第一个输出不会是0


0

在检查 i 并打印它之后,你会将其递增。要么在检查和打印之后递增,要么使用 do while 循环:

int main()
{
    int i = 0;
    do {
        printf("%d\n", i);
    } while(i++ < 10);
    return 0;
}

-1
当评估while循环while(i++ < 10)时,它会检查i的值,将其加一,并将旧值与10进行比较。当你将其改为while(++i < 10)时,它会在比较新值与10之前递增i的值。
无论哪种方式,到达下一个语句时,i已经被递增了。
如果你想打印从0到9,你可以尝试
    while(i < 10)
     printf("%d\n", i++);

相反,此时i的值在提供其原始值给printf语句之后被递增。


-3

while循环会检查条件是否为真,如果为真就执行while块并测试条件是否为假,如果为假则终止while循环。

了解一下while循环中的后增量++。

void main()

{

int rmvivek;

clrscr();

printf("请输入1到10之间的整数值");

scanf("%d",&rmvivek);

while(10>= rmvivek++)

{

printf("数值为=%d\n", rmvivek);

}

getch();

}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接