鱼C论坛

 找回密码
 立即注册
查看: 1980|回复: 8

[已解决]关于“++”“--”自增自减运算符使用的问题

[复制链接]
发表于 2020-7-25 13:18:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
如:设i=3,        j=(i++)+(i++)+(i++);求得i=6, j=12
        设i=3,j=(++i)+(++i)+(++i);求得i=6, j=16
分别是怎么得出的?
最佳答案
2020-7-25 13:30:22
[b]对于前增减运算(++i),
自增自减是按从左到右扫描顺序,
以一个运算符两边涉及前自增减的两个运算对象为单位进行之前增减的;
对于后增减运算(i++),是以整个表达式为单位最后统一增减的


挺难的,慢慢来吧[/b]



                               
登录/注册后可看大图

                               
登录/注册后可看大图



如果帮到你了,设置下最佳可好呀


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

使用道具 举报

发表于 2020-7-25 13:23:44 | 显示全部楼层

i++是先运算后+1
所以j实际计算的是 3+4+5;
i++了三次所有i=3+1+1+1;
所以i=6;j=12;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-7-25 13:28:55 | 显示全部楼层

(++i)+(++i)+(++i),首先扫描求解前半部分,即(++i)+(++i)的值。
先对i进行两次自增运算,i的值变为5,
再计算i+i的值为5+5=10,然后再求解后半部分,
即10+(++i)的值,先对变量i自增1次,i的值变为6,
再计算10+6=16
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-25 13:30:22 | 显示全部楼层    本楼为最佳答案   
[b]对于前增减运算(++i),
自增自减是按从左到右扫描顺序,
以一个运算符两边涉及前自增减的两个运算对象为单位进行之前增减的;
对于后增减运算(i++),是以整个表达式为单位最后统一增减的


挺难的,慢慢来吧[/b]



                               
登录/注册后可看大图

                               
登录/注册后可看大图



如果帮到你了,设置下最佳可好呀


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

使用道具 举报

发表于 2020-7-25 13:39:40 | 显示全部楼层
Hello. 发表于 2020-7-25 13:28

(++i)+(++i)+(++i),首先扫描求解前半部分,即(++i)+(++i)的值。
先对i进行两次自增运算,i的值变为5 ...

不同的编译器结果可能不一样吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-25 13:41:11 | 显示全部楼层
巴巴鲁 发表于 2020-7-25 13:39
不同的编译器结果可能不一样吧

确实是这样,我说的是VC环境,
就这个问题,我都研究好久了哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-25 13:46:20 | 显示全部楼层
我刚百度的结果:
C语言里面明确指出:在两个顺序点之间两次改变同一个变量的任何尝试得到的结果都是不确定的!
如这里
int i=10;
printf("%d,%d,%d\n",++i,--i,-i++);
的两个顺序点分别是int i=10;的分号,和包围printf的参数的括号,C语言只保证位于两个顺序点之间的表达式求值产生副作用在第二个顺序点之前生成,但不保证两个顺序点之间所有表达式的求值顺序。你这里++i,--i,-i++三个表达式企图在两个顺序点前一个分号和()之间三次改变同一个变量i的值,所以结果注定是不确定的。
至于为什么C语言要规定相邻顺序点之间的表达式以任意顺序求值,是为了给编译器更多的自由空间,让底层运算操作能由编译器调度安排从而使运算更有效地执行。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-25 13:47:07 | 显示全部楼层
Hello. 发表于 2020-7-25 13:41
确实是这样,我说的是VC环境,
就这个问题,我都研究好久了哈哈

我刚百度的结果:
C语言里面明确指出:在两个顺序点之间两次改变同一个变量的任何尝试得到的结果都是不确定的!
如这里
int i=10;
printf("%d,%d,%d\n",++i,--i,-i++);
的两个顺序点分别是int i=10;的分号,和包围printf的参数的括号,C语言只保证位于两个顺序点之间的表达式求值产生副作用在第二个顺序点之前生成,但不保证两个顺序点之间所有表达式的求值顺序。你这里++i,--i,-i++三个表达式企图在两个顺序点前一个分号和()之间三次改变同一个变量i的值,所以结果注定是不确定的。
至于为什么C语言要规定相邻顺序点之间的表达式以任意顺序求值,是为了给编译器更多的自由空间,让底层运算操作能由编译器调度安排从而使运算更有效地执行。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-25 15:28:05 | 显示全部楼层
谭浩强看多了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-11 11:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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