鱼C论坛

 找回密码
 立即注册
查看: 2171|回复: 6

[已解决]关于i++

[复制链接]
发表于 2021-2-18 21:22:43 | 显示全部楼层 |阅读模式
3鱼币
#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
OC15K43RE~WR9LX[90Q9.png

最佳答案

查看完整内容

我记起来了,这好像涉及到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 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-2-18 21:34:54 | 显示全部楼层
i++是先执行printf再执行i=i+1,
而++i则是反过来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-2-18 21:44:12 | 显示全部楼层
你不会是搞错中文的逗号与英文的吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-2-18 22:57:54 | 显示全部楼层
先说好我用的VS
i++是先取值后运算 记住这个就可以了不要钻牛角尖  非要钻牛角尖的话我只能说编译器不同得出的结果也不同 不信你可用VC6.0试下 结果是9,9,9,-9,-9
或者你可以了解C语言运算符结合性来理解,++或--都是自右向左,这样的话就是先算最后面的-i--一次往左运算
不知道说的对不对,我个人理解,如有大佬可以指点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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,
学了栈的知识就好理解多了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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鱼币 +3 收起 理由
client_2233 + 3 谢谢,明白了

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 15:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表