++和--操作符分析
发布日期:2021-07-01 04:23:57
浏览次数:2
分类:技术文章
本文共 1403 字,大约阅读时间需要 4 分钟。
文章目录
1 ++和–操作符分析
1.1 ++和–操作符的本质
++和- -操作对应两条汇编指令。
前置:
- 变量自增(减)1
- 取变量值
后置:
- 取变量值
- 变量自增(减)1
1.2 ++和–操作符使用分析
下面两个表达式的值是多少?
#includeint main(){ int i = 0; int r = 0; r = (i++) + (i++) + (i++); printf("i = %d\n", i); printf("r = %d\n", r); r = (++i) + (++i) + (++i); printf("i = %d\n", i); printf("r = %d\n", r); return 0;}/*vc编译器中:i= 3,r = 0, i = 6, r = 18。r = i + i + i, i += 1,i += 1,i += 1。i += 1,i += 1,i += 1,r = i + i + i。gcc编译器中:i= 3,r = 0, i = 6, r = 16。r = i + i + i, i += 1,i += 1,i += 1。i += 1,i += 1,r = i + i, i += 1, r += i。java编译环境中:i= 3,r = 3, i = 6, r = 15。*/
从上面的例子我们可以看出其实++和–是C语言中的灰色地带,不同编译器的具体实现不同。
我们需要知道:
- C语言只规定了++和- -对应指令的相对执行次序(意思是先取值还是先自增,并没有规定两条汇编指令必须连续执行)。
- ++和- - 对应的汇编指令不一定连续运行。
- 在混合运算中,++和- -的汇编指令可能被打断执行(如gcc编译器)。
- ++和- - 参与混合运算结果是不确定的。
2 编译器的贪心法阅读技巧
2.1 编译器的贪心法阅读技巧
编译器通过贪心法处理表达式中的子表达式。
对于如下代码,编译器究竟如何解释?
对于如上表达式,编译器通常采用贪心法。使用贪心法进行++、–表达式的阅读技巧如下:- 编译器处理的每个符号应该尽可能多的包含字符。
- 编译器以从左向右的顺序一个一个尽可能多的读入字符。
- 当读入的字符不可能和已读入的字符组成合法字符为止。
- 空格可以作为C语言中一个完整符号的休止符,编译器读入空格后立即对之前读入的符号进行处理。
#includeint main(){ int i = 0; int j = ++i+++i+++i; // ++i++ ==>1++ (error) int a = 1; int b = 4; int c = a+++b; //a+++b; 1 + 4 ==> 5 a ==> 2 int* p = &a; b = b/*p; //此处会被当成注释 printf("i = %d\n", i); printf("j = %d\n", j); printf("a = %d\n", a); printf("b = %d\n", b); printf("c = %d\n", c); return 0;}
参考资料:
转载地址:https://muzimin.blog.csdn.net/article/details/103710810 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2024年04月17日 09时52分11秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
SnapEx的新感觉,对新手很友好
2019-05-01
首个聚合器怎么产生的,并运用领域在什么
2019-05-01
区块链技术应用,最先医疗行业
2019-05-01
新币上市旧币会降价吗
2019-05-01
当博士进入币圈会怎么样
2019-05-01
《增长黑客》(肖恩·艾利斯)学习笔记——第二部分 实战
2019-05-01
python使用HTMLTestRunner查看运行函数
2019-05-01
python的ImportError
2019-05-01
linux下安装jenkins+git+python
2019-05-01
解决uiautomatorviewer中添加xpath的方法
2019-05-01
性能测试的必要性评估以及评估方法
2019-05-01
Spark学习——利用Mleap部署spark pipeline模型
2019-05-01
Oracle创建表,修改表(添加列、修改列、删除列、修改表的名称以及修改列名)
2019-05-01
使用redis实现订阅功能
2019-05-01
对称加密整个过程
2019-05-01
java内存模型
2019-05-01
volatile关键字
2019-05-01
Servlet_快速入门
2019-05-01
Servlet_生命周期方法
2019-05-01