一段输出自身代码的好玩程序
2013-12-06 10:27
811 查看
下面是一段有趣的C语言代码:
编译运行一下,你会发现输出内容是:
main(char *a){printf(a,34,a="main(char *a){printf(a,34,a=%c%s%c,34);}",34);}
和代码一样,是不是很有趣?
这里只是用了printf的一个特点。它的使用原型是这样的:
本程序使用到的一个技巧是,让某个字符串,即做输出格式字符串,又做附加参数。
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》
#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》
相关文章推荐
- 关于输出null对象,以及try/catch/finally比较好玩的一段代码
- 能输出自身代码的程序
- 简单算法--一个整形数逆序输出后正序输出/一段精彩的递归代码
- 编写程序,将ax中的0变1,1变0,最后输出ax中1的个数题目:编写程序,将ax中的1变成0,0变成1,最后输出ax中1的个数; 程序代码如下所示:
- 一段好玩的编程代码
- //Windows系统下可以用 time(),clock(),timeGetTime(),GetTickCount(),QueryPerformanceCounter()来对一段程序代码进行计时
- c#程序删除自身代码示例分享
- 编写一个程序,接受用户输入的一段英文文字后,输出其中的字符数、单词数和句子数(设句子以"?"、"!"、"."结束)。
- 自己联系的一段小代码 电话本管理程序
- 编写一段程序,从标准输入读取string对象的序列直到连续出现两个相同的单词或者所有单词都读完为止。使用while循环一次读取一个单词,当一个单词连续出现两次是使用break语句终止循环。输出连续重复出现的单词,或者输出一个消息说明没有人任何单词是重复出现的。
- 请说出下面一段代码的输出结果
- 一个能输出自身程序。
- iOS 中 当程序进入后台 但是程序员希望在程序进入后台的时候还可以运行一段代码时候可以做以下的操作
- 一段好玩的代码
- Linux 管道替换标准输入输出 实现2个独立程序代码之间的通信
- 唉,PPLIVE考了个输出自己本身代码的程序
- 一段好玩的程序
- 打印自身代码的C语言小程序
- Bootstrap3 代码-程序输出
- 实验8 统计和输出一次考试中的最高分、最低分、平均分,以及在90~100、 80~89、 70~79、 60~69和60分以下各分数段的人数。程序代码如下(可复制):