彻底了解“++”,让你不在纠结“i++”还是“++i“
c语言吧
全部回复
仅看楼主
level 11
pengzhenxx 楼主
直接看编译后生成的字节码或者机器码,能更加直接的了解这俩货的区别,我这里用TimScript来进行演示,TimScript可以生成中文的调试文件,所以看得很清楚(注意:TimScript像Java一样将源代码编译成字节码而非机器码,字节码由Tim虚拟机执行),字节码和机器码其实执行原理一样具备类比条件
来个最简单的,i++,++i吧
##
其实生成的字节码指令完全一样看,执行效率自然也是完全一致的
再来个for循环吧
这两个for生成的字节码指令,除了跳转指令的地址和所使用的的变量地址有所不同以外,同样是一毛一样的指令,效率自然也是一样.
对于编译而言这种单独的”i++“和”++i“的语法逻辑是一样的,所以自然编译成一模一样的指令(字节码指令或机器码指令),这还不是编译器优化的问题,,,单独写这俩货的语法逻辑就是一样的
2021年06月29日 14点06分 1
level 11
pengzhenxx 楼主
但是”i++“和”++i“不单独写,放到数组小标,指针运算中就有不同的语法逻辑了
如图所示,我已经把不同的指令给注释出来了,虽然执行指令的条数一样,但是“i++”会复制递增之前的值,实际要么用一个临时变量保存递增之前的值,要么在递增后的值上在做减1操作,,,而“++i”直接就是复制的递增后的值,不用做什么额外计算或赋值,因此此时“++i”效率更高。。。
特别注意:这种在数组下标中的“++i”多数情况下程序逻辑是有问题的,这里只是演示用。
总结一下:
1.单独的“i++”和“++i”,语法逻辑一样,生成的指令也是一样的,所以效率一致。
2.在数组下标中的“i++”和“++i”,或者某些指针运算,语法逻辑不一样,效率有区别。
3.其实尽量不要在程序中体现“i++”和“++i”的区别,类似arr[i++], *p++这样的代码少些,甚至不写为好。
2021年06月29日 15点06分 2
level 6
。。
2021年06月29日 15点06分 3
level 1
c++才有这问题,操作符重载,会构造临时对象,C语言凑什么热闹..
2021年06月29日 23点06分 4
.js
2021年06月30日 00点06分
之前看一下帖子内容吧
2021年06月30日 00点06分
至少看一下帖子内容
2021年06月30日 00点06分
@pengzhenxx 这本来就是c++的问题,在c++里,由于操作符重载,一个会构造临时对象,一个不会构造临时对象,可能在构造那个临时对象时做很多别的工作,所以编译器不好把临时对象直接去掉,导致效率有差别。你要透过现象看本质,而不是没有理论指导就去做各种测试,浪费时间。
2021年06月30日 00点06分
level 8
欢迎交流学习 有大佬免费解答问题哦
2021年06月30日 09点06分 6
1