c语言中递增/递减运算符副作用啥时候产生
1.假设一段代码里有abcdefgh这8个求值行为,他们之间有若干序列点,记为|:ab|cde|f|gh假设cde之中会发生一次副作用,不考虑其他特殊条款,那这次副作用保证发生在ab之后,f之前。但这次副作用在cde中的位置没有任何保证,也许发生在cd间,也许在de间,也许藏在d之中,甚至有可能和de都重合。2.运算符优先级是在构建语法树的时候用于消除二义性的,和运行期求值顺序没有必然联系。另外提醒一点,表达式a++的值是一个a的副本,所以副本产生之后,无论a如何变化,都不会影响这个副本的值。这个副本的产生时机保证先于此次++的副作用。
■网友
运算优先级、结合性、求值顺序、副作用和顺序点以前在blog总结过这个补充说明一点,需要注意的是这里的副作用是指最后修改内存的操作,就是说++并不是看做一个连续的原子操作,这就意味着,如果你两个顺序点之间对i做了两次++,则不仅在不同情况下结果不同,甚至i并不保证一定加了两次,因为有可能这样:tmp1 = itmp1 += 1tmp2 = itmp2 += 1i = tmp1 //副作用i = tmp2 //副作用只有最后给i写回值才算是副作用,这个情况下到下个顺序点,虽然执行了两次++运算,也执行了两次副作用,但是由于互相穿插,i只增加了一次在gcc下我曾经测试出过这种情况,但代码有点复杂,忘了是什么样了
■网友
++是立即生效的,比如:\tint i = 1;\tprintf("%d",++i + 1);结果一定是3.如果是:printf("%d",i++ + 1);结果一定是2.++i是将i+1然后把相加后的值用来参与运算,i++是将i+1用相加前的值参与运算.他们都是将i加了1,只不过参与本次运算时用的是增加前的值还是增加后的这点不同而已.会改变变量的效果叫做副作用,比如i=2就是副作用,改变了i的值,不理解也没关系你只要记住不要写出i++ + ++i这种代码就行了.
推荐阅读
- Go语言中为啥要保留goto?
- 怎样在C语言中处理显式(有理)多项式表达式
- C++没有返回值也可以运行
- R 语言中怎样表示非常非常大的数字
- C语言中scanf的返回值问题。status=scanf(\"%d\
- |音乐剧受捧 “二刷”“三刷”让排演呈递增趋势
- 汽车|全新数字高尔夫的“效用递增论”
- c语言中一整型数与实型数相加,结果是啥类型 ?
- 江苏|江苏射阳市民送来的“长嘴鸟” 原是寓言中的“丘鹬”
- C语言中用unsign short替代int类型,咋克服不能使用负数的缺陷
