都是用i++做递增,为什么结果不一样?

在看了i++与++i的区别之后,我尝试自己敲代码来实践一下,可是我发现i++在printf前和在printf里进行运行结果也不相同。
求解惑

img

img

img


#dev-c++ 5.11

直接printf("%d",i++)等价于printf("%d",i);i=i+1; 你先i++就是相当于i=i+1后再printf("%d",i)。前者输出原来的值i=5,后者是先自加到6了再输出6。

对啊,单独写 i++ ,那么就是6
写在 printf 就是5
如果
printf("%d", ++i); 这个也是6

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 请看👉 :i++和printf不得不说的故事
  • 除此之外, 这篇博客: printf出入栈详解中的 1. 从++i和i++说起 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    int main()
    {
        int i = 0;
        //i++ = 100;      //编译出错: error C2106: “=”: 左操作数必须为左值
        ++i = 1;          //没有错误
        printf("%d", i);  //输出1
        return 0;
    }
    

    从上面的代码情况可以认为编译器在处理i++和++i的方式不同

    • i++完成之后返回的是右值也就是一个常量
    • ++i完成之后返回的是左值也就是i的内存,对++i赋值相当于给i赋值。

    结论:printf() 压栈的时候,i++其实压的是中间结果的值,也就是一个常量。而++i因为计算后的结果是一个左值,故会将i对应的地址进行压栈。


  • 以下回答来自chatgpt:

    问题的原因是由于i++和++i的运算规则和操作符的位置不同导致的。

    i++是后加加,它的原理是先返回i的值,然后再将i加1。所以当i++放在printf语句之前时,i的值会先被输出,然后再将i加1。

    而++i是前加加,它的原理是先将i加1,然后再返回i的值。所以当++i放在printf语句之前时,i的值会先被加1,然后再输出。

    以下是代码示例来验证这一区别:

    #include <stdio.h>
    
    int main() {
        int i = 0;
    
        printf("%d\n", i++);  // 输出0,然后i加1
        printf("%d\n", i);    // 输出1
    
        printf("%d\n", ++i);  // i先加1,然后输出,输出1
        printf("%d\n", i);    // 输出1
    
        return 0;
    }
    

    解释: - 第一个printf语句中,先输出0,然后i的值加1变为1。 - 第二个printf语句中,输出1。 - 第三个printf语句中,i先加1变为2,然后输出2。 - 第四个printf语句中,输出2。

    这个例子就展示了i++和++i在不同位置运行时得到的不同结果。通过对这些代码的分析,我们可以发现i++和++i运算符的使用需谨慎,尽量避免在同一个表达式中多次使用,以免造成代码的混乱和维护的困难。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^