client_2233 发表于 2021-2-18 21:22:43

关于i++

#include <stdio.h>

int main ()
{
int i = 9;

printf ("%d,%d,%d,%d,%d\n", i, i++, i--, -i++, -i--);

return 0;
}
求助:为什么i++是8?不应该是9吗?
求大佬解答!

一叶枫残 发表于 2021-2-18 21:22:44

我记起来了,这好像涉及到printf的入栈出栈知识,它是从右到左计算的,对于printf中的i, i++, i--, -i++, -i--,
它先计算 i--(-i--里的表达式i--),出栈时i==9,所以第一个是9,再计算i=i-1,i变成8了
接着计算i++(-i++里的表达式i++),出栈时i == 8(这是上一步i++遗留的结果),所以第二个是8,再计算i=i+1,i变成了9
再接着是i--(i--里的表达式),出栈时i == 9(上一步i++遗留的结果),所以第三个是9,再计算i=i-1,i变成了8
接着是i++(i++里的表达式),出栈是i == 8(这是上一步i++遗留的结果),连上符号-,所以输出为-8,再计算i=i+1,i变成了9
最后是i,出栈是i==9(上一步遗留的结果),连上符号-,所以输出为-9

一叶枫残 发表于 2021-2-18 21:34:54

i++是先执行printf再执行i=i+1,
而++i则是反过来

一叶枫残 发表于 2021-2-18 21:44:12

你不会是搞错中文的逗号与英文的吧

han125416866 发表于 2021-2-18 22:57:54

先说好我用的VS
i++是先取值后运算 记住这个就可以了不要钻牛角尖非要钻牛角尖的话我只能说编译器不同得出的结果也不同 不信你可用VC6.0试下 结果是9,9,9,-9,-9
或者你可以了解C语言运算符结合性来理解,++或--都是自右向左,这样的话就是先算最后面的-i--一次往左运算
不知道说的对不对,我个人理解,如有大佬可以指点

一叶枫残 发表于 2021-2-18 23:31:34

简单来说,从右到左,连续计算i--,i++,i--,i++,i,
值依次为9(a) 8 9 8 9,从a处的9开始入栈,叠起来从下往上就是9 8 9 8 9(b),出栈就从上面的出,也就是b这里,连带符号就变成了 9 8 9 -8 -9,
学了栈的知识就好理解多了

do8do8do8 发表于 2021-2-19 09:52:08

求助:为什么i++是8?不应该是9吗?
答:这个不单纯是++前后的问题,还要涉及到printf()函数从右向左求值的特点。
      ++在前是先加,++在后是后加
      printf(......,a,b,c,d,e)的求值顺序是(e d c b a ...)
    举个例子
   int i=5;
   printf("%d,%d,%d,%d,%d\n",--i,i++,--i,i,++i);的结果是什么
    显然按printf从右到左的求值顺序那么就是逆过来计算(++i,i,--i,i++,--i)==>(6,6,5,5,5)
    然后在逆过去显示5,5,5,6,6
页: [1]
查看完整版本: 关于i++