黑马程序员技术交流社区

标题: a = a++问题 [打印本页]

作者: yi95392    时间: 2015-5-28 00:00
标题: a = a++问题
之前学习的时候碰到的问题,后来解决了,就没放在心上,不过发现这是道面试题,就拿出来和大家分享.

下面的代码输出a等于多少呢?
  1. #include <stdio.h>
  2. int main()
  3. {
  4.     int a = 0;
  5.     a = a++;
  6.     printf("%d\n",a);
  7.     return 0;
  8. }
复制代码


答案是0(之前一直以为是1);
答案分析:1.a++表达式是先用后加,故表达式的值为0;
                 2.取出a++表达式的值后,执行++操作,a变成1;
                 3.将之前取出来的a++表达式的值(即0)赋值给a,a变成0;

大概看的懂汇编的,可以看看计算机具体怎么运行的
(xcode,菜单栏Debug->Debug Workflow->Always Show Disassembly选中后,打断点运行就可以看到汇编代码啦!!)
  1. 0x100000f46:  movl   $0x0, -0x8(%rbp)
  2. 0x100000f4d:  movl   -0x8(%rbp), %eax
  3. 0x100000f50:  movl   %eax, %ecx
  4. 0x100000f52:  addl   $0x1, %ecx
  5. 0x100000f58:  movl   %ecx, -0x8(%rbp)
  6. 0x100000f5b:  movl   %eax, -0x8(%rbp)
复制代码

作者: yi95392    时间: 2015-5-28 00:01
自顶一贴:lol
作者: 倔强的柚子    时间: 2015-5-28 00:21
感谢楼主无私分享面试题
作者: 白昼那知夜的黑    时间: 2015-5-28 00:33
不错不错!我也弄错了!
作者: 15578797612    时间: 2015-5-28 09:46
哈哈哈,楼主好心情哪
作者: hi虚无缥缈    时间: 2015-5-28 21:06
汇编语言看不懂,不过分清a++和++a就可以了,
作者: room_jay100    时间: 2015-6-1 22:24
这个问题,有得时候会误解的.以为给赋值了
作者: Residual_mem    时间: 2015-6-1 22:47
66666这种解释也是深深的折服了。
作者: 七尺阳光    时间: 2015-6-1 23:21
原来也做过这个题,只是知道答案,现在明白运算原理了.学习了,谢谢
作者: 蜡笔小炎    时间: 2015-6-2 02:01
我也一直搞不清这个问题,其实现在也不明白。a取值赋给a,再自加1,那输出不就应该是1吗?
作者: taolove    时间: 2015-6-2 08:49
没有看懂怎么运行的!
作者: 晗修    时间: 2015-6-2 09:35
这就是一个后自增和赋值谁先运算的问题
作者: sdzwb89    时间: 2015-6-2 09:42
蜡笔小炎 发表于 2015-6-2 02:01
我也一直搞不清这个问题,其实现在也不明白。a取值赋给a,再自加1,那输出不就应该是1吗? ...

这个是先赋值 后运算的~~也就是 先 让a=a然后 在算a++
作者: 晗修    时间: 2015-6-2 09:49
sdzwb89 发表于 2015-6-2 09:42
这个是先赋值 后运算的~~也就是 先 让a=a然后 在算a++

错了 是先a++ 再赋值 ,但是a++在表达式中计算时  取的是自增前的值0,所以最后赋值到左边时 a的值是0,
a=a++,换一个表达可能就很清晰了,
int a =0;
int b = a++;
a = b;
这就是a = a++的计算过程
作者: sdzwb89    时间: 2015-6-2 10:10
晗修 发表于 2015-6-2 09:49
错了 是先a++ 再赋值 ,但是a++在表达式中计算时  取的是自增前的值0,所以最后赋值到左边时 a的值是0,
...

嗯嗯,我也发现自己一直都没弄明白了。。。  试验了下 循环 发现a的值一直是0:dizzy::dizzy:
作者: 蜡笔小炎    时间: 2015-6-2 10:12
sdzwb89 发表于 2015-6-2 09:42
这个是先赋值 后运算的~~也就是 先 让a=a然后 在算a++

那也是1,什时候++也是1啊
作者: sdzwb89    时间: 2015-6-2 10:13
蜡笔小炎 发表于 2015-6-2 10:12
那也是1,什时候++也是1啊

我也不是很明白~但程序运行的就是0  就算我循环 也是0:dizzy:   我也不明白了
作者: 任伟    时间: 2015-6-2 12:23
谢谢 楼主的分享 学习 学习




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2