一段输出自身代码的好玩程序

原创 2013年12月06日 10:27:24

下面是一段有趣的C语言代码:

#include<stdio.h>
main(char *a){printf(a,34,a="main(char *a){printf(a,34,a=%c%s%c,34);}",34);}

编译运行一下,你会发现输出内容是:

main(char *a){printf(a,34,a="main(char *a){printf(a,34,a=%c%s%c,34);}",34);} 

和代码一样,是不是很有趣?


这里只是用了printf的一个特点。它的使用原型是这样的:

int printf ( const char * format, ... );
其中第一个参数是输出格式字符串。后面的附加参数若干个,都是匹配输出格式中的格式说明符。

本程序使用到的一个技巧是,让某个字符串,即做输出格式字符串,又做附加参数

asccii码中十进制34所对应的字符为英文引号 " 。输出两个34的作用就是为了凑齐引号,让输出结果和代码一致。


注意:

    对于这个程序,字符串指针a是在作为附加参数时才对其赋值的,在作为输出格式字符串时还没有赋值。程序正确运行,所以编译器是从右向左处理参数的(这里测试用的是GCC4.4.3和VS2010)。

比如,printf(a="%c%s%c",34,a="hello",34); 从左到右,a先赋值为"hello",之后a又赋值为"%c%s%c",输出的结果根据后者输出的内容。

或者,printf(a="%c%s%c",34,a,34); 从右到左,a还未赋值,保持着随机值,之后a才赋值为"%c%s%c",这时也来得及。可以正常输出。


参考文献:《Hacker's Delight》

版权声明: GNU General Public License. https://github.com/lucky521

相关文章推荐

web程序启动时执行一段代码

有两种方法,一种是监听(Listener),第二种是配置随项目启动而启动的Servlet。 监听(Listener) 首先,我们创建一个监听的类,继承ServletContextListener,...

一段合并多个有序数组并且升序输出数组元素的C++代码

今天心情由特别烂转变为特别好!!!所以决定写一篇,是实验室里做东西用到的~~ 标题起的不好哈~以下代码的意思就是:合并多个有序数组,由小到大不重复地输出里面的元素值。实现的方法是将这些数组合并建最小...
  • bedding
  • bedding
  • 2011年10月24日 21:25
  • 1579

关于输出null对象,以及try/catch/finally比较好玩的一段代码

先上代码,如果知道输出的

一段项目开发时候用的调试代码 一 --输出特殊信息

有的时候在debug项目时候不能直观的使用调试来查询一些状态,而需要自己写一些辅助代码来检测程序的状态(如开发动态库或者COM组件给第三方程序调用无法使用调试器的环境下等)。 1) 以下是一个可以嵌入...
  • sesiria
  • sesiria
  • 2016年07月06日 09:02
  • 439

写一段程序,找出数组中第k大小的数,输出数所在的位置。

写一段程序,找出数组中第k大小的数,输出数所在的位置。例如{2,4,3,4,7}中,第一大的数是7,位置在4。第二大、第三大的数都是4,位置在1、3随便输出哪一个均可。函数接口为:int   find...

(原创)天惹!原来敲代码可以这样好玩!介绍一款AS的插件sexy editor

瞧一瞧看一看啦! 上班无聊,代码敲不完,怎么办? 其实Android Studio可以这么玩! 今天就来为大家介绍一款好玩的插件sexy editor(性感编辑器) 我承认我看到这名称一开始想歪了~~...

小程序专题:换手机费钱,换壁纸好玩!

最近看跑男都是广告,特别是手机广告,小编想这款国产手机应该不会很贵,一查发现有点贵哦~小编没钱怎么办?**换壁纸吧! ** 极乐小程序商店整理出9款壁纸小程序。让你换着玩!1、IN壁纸制作壁纸:在...

隐藏在手机中的好玩代码

手机里面都有一些内置的隐藏代码,也叫作“指令”,比如当年在功能机时代就很火的“*#06#”(查看手机真实的IMEI号码),可谓无人不知。 虽然这些代码并不是预留给普通消费者使用的(主要是工程师测试使...

上下翻的小程序(超好玩)

  • 2014年04月01日 20:35
  • 13KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一段输出自身代码的好玩程序
举报原因:
原因补充:

(最多只允许输入30个字)