探讨i++和++i

最近笔者在调试代码时发现自己在对++运算符的理解上不够深入,导致一个不应有的bug的出现。
在代码书中或课堂上我们都知道++i和i++在作为一个单独语句使用时没有区别,即相当于i=i+1; 而作为语句的一部分时,如a=++i; 和a=i++; ++i先执行加1操作,再执行赋值操作(因++在前),而i++是先执行赋值操作,再执行加1操作(因++在后)。但这种论述未将其中更深的运行机制讲出来,尤其是在if或while等判断语句中,下面对其进行探讨:

    1. 作为单独语句存在,如下面的两段代码:


int i=0;

if(i++){...}







int i=0;

if(++i){...}






      上面的条件判断代码虽然是以单独语句出现,但编译器将其

等价于i++(或++i)>0

      ,故在第一段代码中先执行i>0判定,再执行i++,因此条件体里的代码不被执行;而在第二段代码中先执行i=i+1,再执行i>0,因此条件里代码会被执行。




    1. 作为语句的一部分存在,如下面的一段代码:


int i=4,j=3;

if((i=j++)!=4){...}






      上面的代码中括号()的优先级比!=的优先级高,但编译器仍然将++运算符最后执行。即先执行赋值语句i=j,然后判定(i=3)!=4成立,最后执行j++,接下去执行条件体里代码。





综上可知当i++作为单独条件语句进行判定时,即使没有显示地声明与0的比较,编译器仍将加上与0的比较;当i++作为复合语句使用时,不管++是否在优先级更高的运算符中,++仍然最后才执行,即在当前所在语句操作执行之后。


有关编译器优化的更完整信息,请参阅优化通知

81 评论

顶部
Maplewing的头像

記得老師說++在後端的時候因為會多記一份之前值的備份,
會較耗記憶空間與時間,
故在coding style的時候常常建議我們能寫在前端就盡量寫在前端,
所以後來我的for都寫成++i了XD

梁 何.的头像

i++是个右值,++i是个左值,另外,i++先用后增,++i先增后用。但是,个人觉得还是第一点是本质区别。

匿名的头像

早就知道了

匿名的头像

这个东西呢,深究着玩是可以的,但实际编程中,是不应该用的。
i++ 或 ++i 都应该单独一行,不能跟其它任何操作在同一行中。

匿名的头像

我觉得讨论这种问题一点实际价值都没有
自己用的时候,注意了解一下就ok了

匿名的头像

我们用++ --就是为了简单的 如果给自己带来麻烦那不如不用了呢

匿名的头像

I++是先用后加,而++i是先加后用,最后返回的结果有的时候不同。eg:int i=1,j=0;i++;j=i;则j=1,i=2;但是,int i=1,j=0;++i;j=i;则j=2,i=2

匿名的头像

以前不懂,现在明白一些了

匿名的头像

++前缀返回的是变量的引用,后缀返回的是一个值,这样你可以去检验你的代码了。

匿名的头像

楼主真是犯晕了,++j和j++都没有搞清楚,int i=4,j=3; 2 3 if((i=j++)!=4){...} 执行{}很正确啊,j++是j先参与运算,即,j=3参加了运算之后才对j增加了1,,,,lz犯晕,我以为你发现了什么东西呢。害得这么多人来围观

页面

添加评论

有一个技术问题? 访问我们的论坛网站或软件产品有问题? 联系支持部门.