2+2=5?

li4c 2014-06-25 10:59:15
CSND首页有一片文章,说的是2+2=5;并且还有代码,我不知到其中有什么猫腻?
int main()
{
char __func_version__[] = "5"; // For source control
char b[]="2", a=2;
printf("%d + %s = %s\n", a, b, a+b);
return 0;
}
...全文
779 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
707wk 2014-07-04
  • 打赏
  • 举报
回复
画画内存图就知道为什么了
ForestDB 2014-06-26
  • 打赏
  • 举报
回复
printf("%d + %s = %s\n", a, b, a+b); 输出的是__func_version__
xuzhouweihao 2014-06-25
  • 打赏
  • 举报
回复
这个就是去除b加2地址的值,就看数据在寄存器中怎么存储的了 如下: 我的64位下面是: (gdb) p &b $3 = (char (*)[2]) 0x7fffffffe470 b的地址是这个 (gdb) p &__func_version__ $4 = (char (*)[2]) 0x7fffffffe480 数据5的地址是这个 (gdb) p b+a $5 = 0x7fffffffe472 " 14" b+a的地址是这个,现在这个地址中存储的数据是14。 所以b+a就是14了。
赵4老师 2014-06-25
  • 打赏
  • 举报
回复
理解讨论之前请先学会如何观察
赵4老师 2014-06-25
  • 打赏
  • 举报
回复
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步对应汇编一行! VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
  • 打赏
  • 举报
回复
引用 7 楼 u013163178 的回复:
理解了,原来是是利用栈的生长方向和函数压栈来实现的。又学习了
理解了就OK^_^
  • 打赏
  • 举报
回复
16位编译器时代的东西,在32、64位时代玩会有些问题的。这么落伍的东西来了也不知道改一下。。。
这是原理分析图:
li4c 2014-06-25
  • 打赏
  • 举报
回复
引用 6 楼 starytx 的回复:
这个问题有意思的很啊,闲的蛋疼了可以研究一下
你在嘲讽我,我已经知道是怎么实现的了,又长姿势了
li4c 2014-06-25
  • 打赏
  • 举报
回复
理解了,原来是是利用栈的生长方向和函数压栈来实现的。又学习了
starytx 2014-06-25
  • 打赏
  • 举报
回复
这个问题有意思的很啊,闲的蛋疼了可以研究一下
灌水号 2014-06-25
  • 打赏
  • 举报
回复
这个得编译器的,VC6就显示的不行。 VC6显示的是 烫5
brookmill 2014-06-25
  • 打赏
  • 举报
回复
我觉得,没准在某些系统或编译器有可能不是5,看栈内存怎么分配了
brookmill 2014-06-25
  • 打赏
  • 举报
回复
引用 1 楼 longburulin 的回复:
有意思么 一个是指针 一个是数值,加起来也就是地址的值偏移了几位了
确实没什么意思,还不如直接这样更爽快 printf("%s", "2+2=5");
brookmill 2014-06-25
  • 打赏
  • 举报
回复
这里的b和a+b都是用%s作为字符串打出来的。b的内容是2,而a+b也就是b+2这个指针想必是指向了之前的__func_version__,所以就是5了
longburulin 2014-06-25
  • 打赏
  • 举报
回复
有意思么 一个是指针 一个是数值,加起来也就是地址的值偏移了几位了
  • 打赏
  • 举报
回复
加油吧,楼主~~~ 推荐一本书:《程序员的自我修养----链接装载与库》
jmppok 2014-06-25
  • 打赏
  • 举报
回复
printf("%d + %s = %s\n", a, b, a+b); 想到了大学时一个C语言老师出的考题
大熊猫侯佩 2014-06-25
  • 打赏
  • 举报
回复
好吧你们都没看到我的帖子啊: http://blog.csdn.net/mydo/article/details/34422733
ggglivw 2014-06-25
  • 打赏
  • 举报
回复
玩的好高级~,不过对一般做项目的人来说,不能写这种代码
lm_whales 2014-06-25
  • 打赏
  • 举报
回复
研究一般都有两个以上的方向, 大致上: 一个是顺的,研究事情如何做,如何做正确,如何做更好。 一个逆的,研究如何做会错误,会有什么样的错误,事情怎么能够做不出来。 有时候,需要二者结合,才能够把事情做好。。
加载更多回复(1)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧