探讨i++和++i
来源:互联网 发布:淘宝手机端模板在哪里 编辑:程序博客网 时间:2024/05/16 12:42
探讨i++和++i
作者: Jiaping Gui 桂佳平 (Intel) (5 篇文章) 日期: 六月 11, 2012 在 3:11 下午
最近笔者在调试代码时发现自己在对++运算符的理解上不够深入,导致一个不应有的bug的出现。
在代码书中或课堂上我们都知道++i和i++在作为一个单独语句使用时没有区别,即相当于i=i+1; 而作为语句的一部分时,如a=++i; 和a=i++; ++i先执行加1操作,再执行赋值操作(因++在前),而i++是先执行赋值操作,再执行加1操作(因++在后)。但这种论述未将其中更深的运行机制讲出来,尤其是在if或while等判断语句中,下面对其进行探讨:
- 作为单独语句存在,如下面的两段代码:
- int i=0;
- if(i++){...}
- int i=0;
- if(++i){...}
上面的条件判断代码虽然是以单独语句出现,但编译器将其等价于i++(或++i)>0,故在第一段代码中先执行i>0判定,再执行i++,因此条件体里的代码不被执行;而在第二段代码中先执行i=i+1,再执行i>0,因此条件里代码会被执行。
- 作为语句的一部分存在,如下面的一段代码:
- int i=4,j=3;
- if((i++=j++)!=4){...}
上面的代码中括号()的优先级比!=的优先级高,但编译器仍然将++运算符最后执行。即先执行赋值语句i=j,然后判定(i=3)!=4成立,最后执行i++和j++,接下去执行条件体里代码。
综上可知当i++作为单独条件语句进行判定时,即使没有显示地声明与0的比较,编译器仍将加上与0的比较;当i++作为复合语句使用时,不管++是否在优先级更高的运算符中,++仍然最后才执行,即在当前所在语句操作执行之后。
分类: Android 开发, Blog Challenge, Ultrabook, 企业应用开发, 全国博客大奖赛, 全国大学生软件创新大赛专栏, 其他, 图形和视觉计算, 开放源代码, 虚拟化技术, 高校博客大奖赛
如需了解英特尔软件产品相关的性能和优化选项,请参阅优化注意事项.
评论 (10)
2012年06月26日 11:07
齐晓明if((i++=j++)!=4){...} 这句能编译过去么?。。。
++i:
T& operator ++ ()
{
++ T;
return T;
}
i++;
const A& operator ++ (int)
{
temp = T;
++ T;
return temp;
}
齐晓明if((i++=j++)!=4){...} 这句能编译过去么?。。。
++i:
T& operator ++ ()
{
++ T;
return T;
}
i++;
const A& operator ++ (int)
{
temp = T;
++ T;
return temp;
}
2012年06月26日 11:24
ikarenator“先行判定”的说法乃是错误。实际上是 ++i 返回了 i 的一个引用而 i++ 返回了 i 在改变前的一个拷贝。实际上 ++ 的操作总是在返回值之前就完成的。后面也是讹误。
ikarenator“先行判定”的说法乃是错误。实际上是 ++i 返回了 i 的一个引用而 i++ 返回了 i 在改变前的一个拷贝。实际上 ++ 的操作总是在返回值之前就完成的。后面也是讹误。
2012年06月26日 18:21
mt521不错,可以试试
mt521不错,可以试试
2012年06月26日 19:05
megadeath对于
if((i++=j++)!=4)
i++怎么能作为左值呢?编译器不报错么?
megadeath对于
if((i++=j++)!=4)
i++怎么能作为左值呢?编译器不报错么?
2012年07月04日 07:20
fyzzy1943我就想知道,,谁没事闲的要这么写呢?
fyzzy1943我就想知道,,谁没事闲的要这么写呢?
2012年07月11日 05:37
toby写得还可以,不过理解只是一种,就好像法律是不允许解释的,C语言也是一样。
无论怎么解释,只要规定中没有那么写,别人就可以有其他理解,而写编译器的人一旦和你的理解不同,就会产生问题。
因此,这种用法就是错误的种子。我觉得比错误更可怕!因为他可能发生在定稿5年以后的程序上……
toby写得还可以,不过理解只是一种,就好像法律是不允许解释的,C语言也是一样。
无论怎么解释,只要规定中没有那么写,别人就可以有其他理解,而写编译器的人一旦和你的理解不同,就会产生问题。
因此,这种用法就是错误的种子。我觉得比错误更可怕!因为他可能发生在定稿5年以后的程序上……
2012年07月12日 19:55
其实俺不是什么所谓的坏人首先 BS下++ --不单独写一个语句的。
这种写法,自己给自己添麻烦不说,还给别人添麻烦。
其实俺不是什么所谓的坏人首先 BS下++ --不单独写一个语句的。
这种写法,自己给自己添麻烦不说,还给别人添麻烦。
2012年07月15日 06:45
laciqs“综上可知当i++作为单独条件语句进行判定时,即使没有显示地声明与0的比较,编译器仍将加上与0的比较”
这和++运算符无关,写个if(i)一样会比较,因为这是控制表达式。
另外,if((i++=j++)!=4){...} 这种写法不应该在project中出现的。
要想说探讨的i++和++i的话,从C语言上来说除了应该注意顺序点问题外没什么值得说是探讨的,从汇编层面上理解才能勉强说是探讨。
laciqs“综上可知当i++作为单独条件语句进行判定时,即使没有显示地声明与0的比较,编译器仍将加上与0的比较”
这和++运算符无关,写个if(i)一样会比较,因为这是控制表达式。
另外,if((i++=j++)!=4){...} 这种写法不应该在project中出现的。
要想说探讨的i++和++i的话,从C语言上来说除了应该注意顺序点问题外没什么值得说是探讨的,从汇编层面上理解才能勉强说是探讨。
2012年07月18日 06:22
匿名不同的编译器有不同的实现,探讨这种东西纯粹是吃饱了撑着。
匿名不同的编译器有不同的实现,探讨这种东西纯粹是吃饱了撑着。
- 探讨i++和++i
- 探讨i++和++i
- 探讨i++和++i
- 探讨i++和++i
- 探讨i++和++i
- 探讨i++和++i
- 探讨i++和++i
- 探讨i++和++i
- 探讨i++和++i
- 探讨i++和++i
- 探讨i++和++i
- C++:探讨i++和++i
- 69.探讨i++和++i
- (C)探讨i++和++i
- 探讨i++跟++i
- 探讨i++和++i的不同
- c语言基础之探讨i++和++i
- ++i,i++的效率探讨
- 最近在研究编译android源码看见个cm9的转过来看看
- 哲理故事与管理之道(2)-留个缺口给下属
- 网卡中断负载均衡
- Could not initialize class net.sf.cglib.proxy.Enhancer解决办法
- mail技术相关
- 探讨i++和++i
- 调试方法小结(持续更新)
- LINUX计算CPU、内存的使用率
- hive与hbase整合
- linux C程序员 经典面试题一
- 利用Postfix搭建邮件系统
- nginx+gunicorn运行django
- 【insigma】properties文件的编写
- 整数型int 为什么不可以用 memset 函数?
mk1111不是问题的问题,++ -- 的时间是以整个语句为衡量的