A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© yi95392 中级黑马   /  2015-5-28 00:00  /  1420 人查看  /  17 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

之前学习的时候碰到的问题,后来解决了,就没放在心上,不过发现这是道面试题,就拿出来和大家分享.

下面的代码输出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)
复制代码

17 个回复

倒序浏览
自顶一贴:lol
回复 使用道具 举报
感谢楼主无私分享面试题
回复 使用道具 举报
不错不错!我也弄错了!
回复 使用道具 举报
哈哈哈,楼主好心情哪
回复 使用道具 举报
汇编语言看不懂,不过分清a++和++a就可以了,
回复 使用道具 举报
这个问题,有得时候会误解的.以为给赋值了
回复 使用道具 举报
66666这种解释也是深深的折服了。
回复 使用道具 举报
原来也做过这个题,只是知道答案,现在明白运算原理了.学习了,谢谢
回复 使用道具 举报
我也一直搞不清这个问题,其实现在也不明白。a取值赋给a,再自加1,那输出不就应该是1吗?
回复 使用道具 举报
taolove 来自手机 中级黑马 2015-6-2 08:49:50
11#
没有看懂怎么运行的!
回复 使用道具 举报
这就是一个后自增和赋值谁先运算的问题
回复 使用道具 举报
蜡笔小炎 发表于 2015-6-2 02:01
我也一直搞不清这个问题,其实现在也不明白。a取值赋给a,再自加1,那输出不就应该是1吗? ...

这个是先赋值 后运算的~~也就是 先 让a=a然后 在算a++
回复 使用道具 举报
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++的计算过程
回复 使用道具 举报
晗修 发表于 2015-6-2 09:49
错了 是先a++ 再赋值 ,但是a++在表达式中计算时  取的是自增前的值0,所以最后赋值到左边时 a的值是0,
...

嗯嗯,我也发现自己一直都没弄明白了。。。  试验了下 循环 发现a的值一直是0:dizzy::dizzy:
回复 使用道具 举报
sdzwb89 发表于 2015-6-2 09:42
这个是先赋值 后运算的~~也就是 先 让a=a然后 在算a++

那也是1,什时候++也是1啊
回复 使用道具 举报
蜡笔小炎 发表于 2015-6-2 10:12
那也是1,什时候++也是1啊

我也不是很明白~但程序运行的就是0  就算我循环 也是0:dizzy:   我也不明白了
回复 使用道具 举报
谢谢 楼主的分享 学习 学习
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马