免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4482 | 回复: 18
打印 上一主题 下一主题

[C] 突然想不明白这几个语句执行过程的区别 [复制链接]

论坛徽章:
1
辰龙
日期:2014-05-22 11:38:58
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-08-13 10:35 |只看该作者 |倒序浏览
本帖最后由 winway1988 于 2012-08-13 11:01 编辑
  1.         int a = 1;
  2. ++a;
  3.         a++;
  4.         a += 1;
  5.         a = a + 1;
复制代码
  1. gcc -O0 -S test.c
复制代码
生成的汇编代码也是一样的,不知道这些语句分别都是怎么执行的?
谢谢指点!

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2012-08-13 11:10 |只看该作者
本来就一样。

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
3 [报告]
发表于 2012-08-13 12:46 |只看该作者
回复 2# flw


    不行,怎么能一样呢,这样不是给反汇编成C语言制造障碍么

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2012-08-13 13:54 |只看该作者
folklore 发表于 2012-08-13 12:46
回复 2# flw

反汇编到 C 语言?
你听说过活猪做成火腿肠之后,还能从火腿肠变回活猪的吗?
就算是你用很多火腿肠捏一个猪,那也只是个形状,并不会和原来的相同。

C 语言程序编译之后再反汇编成 C 语言之后,肯定和原来是不一样的。

论坛徽章:
0
5 [报告]
发表于 2012-08-13 14:17 |只看该作者
最起码最后两个是一样的

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
6 [报告]
发表于 2012-08-13 15:17 |只看该作者
回复 4# flw


   
反汇编到 C 语言?
你听说过活猪做成火腿肠之后,还能从火腿肠变回活猪的吗?
就算是你用很多火腿肠捏一个猪,那也只是个形状,并不会和原来的相同。

C 语言程序编译之后再反汇编成 C 语言之后,肯定和原来是不一样的。


不叫猪那叫什么,
可以重组分子啊

理论上从ASM到C语言是可行的,
只是变量名不好弄而已。

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
7 [报告]
发表于 2012-08-13 15:18 |只看该作者
哈哈 第一次见人牛角尖钻成这样的
lz 你没有别的表达式用到a
如果你写
x = 0;
x = a++;
x = ++a;

然后看汇编码 看一样不一样...

不过 ls的同学都说了 何苦呢 编译器是正确的...

论坛徽章:
1
辰龙
日期:2014-05-22 11:38:58
8 [报告]
发表于 2012-08-13 17:09 |只看该作者
网上搜索的结果很多都说有区别的,还区分出了效率高低。
这个经常出现在面试题里。
不明白这几条语句执行过程的具体区别

论坛徽章:
1
辰龙
日期:2014-05-22 11:38:58
9 [报告]
发表于 2012-08-13 17:16 |只看该作者
@folklore
能否解释解释不通之处
谢谢各位了

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
10 [报告]
发表于 2012-08-13 17:32 |只看该作者
回复 9# winway1988


    LZ, 我7L的回复就是关于这个的.

    i++;
    ++i;
    i = i + 1;
    i += 1;
    这些语句从C语言的语义上来说也是加一. 汇编加一的话, 根本就没差别, 难道计算机还要为加一设置几条指令来体现C语言的语义吗?

    所以,
    x = 0;
    x = i++;
    x = ++i;
    这几个语句才能体现C语言"先用后加", "先加再用"的差别, 所以汇编码才有差别.

    至于说什么"i++是用++i实现的"之类的屁话, 就算了, 别当真. 那意思是说, 计算机其实只有加一的指令, 所以要体现x = i++; 这种语句的C语言语义, 实际上汇编代码要先保存i的原值这样的事情. 另外, 在C++里面, "++"操作符是可以重载的, 对于重载"++"操作符的函数, 一般后缀重载函数实现调用前缀重载函数实现版本.

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP