关于“++”“--”自增自减运算符使用的问题
如:设i=3, j=(i++)+(i++)+(i++);求得i=6, j=12设i=3,j=(++i)+(++i)+(++i);求得i=6, j=16
分别是怎么得出的? 一
i++是先运算后+1
所以j实际计算的是 3+4+5;
i++了三次所有i=3+1+1+1;
所以i=6;j=12; 二
(++i)+(++i)+(++i),首先扫描求解前半部分,即(++i)+(++i)的值。
先对i进行两次自增运算,i的值变为5,
再计算i+i的值为5+5=10,然后再求解后半部分,
即10+(++i)的值,先对变量i自增1次,i的值变为6,
再计算10+6=16 对于前增减运算(++i),
自增自减是按从左到右扫描顺序,
以一个运算符两边涉及前自增减的两个运算对象为单位进行之前增减的;
对于后增减运算(i++),是以整个表达式为单位最后统一增减的
挺难的,慢慢来吧
static/image/hrline/1.gifhttp://m.qpic.cn/psc?/V1046bnt0Whegz/xBqlYxewEGhxwKHKc.e8gWETCXv5ZK9R3sW45wLTg4brxbi1sq8apht8yP2udPC5hWrC4YpaGIDqN2J4a*A1HIXyApe5Vod0pQ*kC.PS7wg!/b&bo=jgWAAjYHPwMDGTg!&rf=viewer_4&t=5
如果帮到你了,设置下最佳可好呀{:10_297:}
Hello. 发表于 2020-7-25 13:28
二
(++i)+(++i)+(++i),首先扫描求解前半部分,即(++i)+(++i)的值。
先对i进行两次自增运算,i的值变为5 ...
不同的编译器结果可能不一样吧{:10_297:}
巴巴鲁 发表于 2020-7-25 13:39
不同的编译器结果可能不一样吧
确实是这样,我说的是VC环境,
就这个问题,我都研究好久了哈哈{:9_230:} 我刚百度的结果:
C语言里面明确指出:在两个顺序点之间两次改变同一个变量的任何尝试得到的结果都是不确定的!
如这里
int i=10;
printf("%d,%d,%d\n",++i,--i,-i++);
的两个顺序点分别是int i=10;的分号,和包围printf的参数的括号,C语言只保证位于两个顺序点之间的表达式求值产生副作用在第二个顺序点之前生成,但不保证两个顺序点之间所有表达式的求值顺序。你这里++i,--i,-i++三个表达式企图在两个顺序点前一个分号和()之间三次改变同一个变量i的值,所以结果注定是不确定的。
至于为什么C语言要规定相邻顺序点之间的表达式以任意顺序求值,是为了给编译器更多的自由空间,让底层运算操作能由编译器调度安排从而使运算更有效地执行。 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语言要规定相邻顺序点之间的表达式以任意顺序求值,是为了给编译器更多的自由空间,让底层运算操作能由编译器调度安排从而使运算更有效地执行。 谭浩强看多了?
页:
[1]