发新话题
打印

读了一句代码

读了一句代码

复制内容到剪贴板
代码:
这句代码出自Vlad Taeerov和Rashit Fakhreyev之手,功能是打印自身.全长64个字符:
main(a){printf(a,34,a="main(a){printf(a,34,a=%c%s%c,34);}",34);}
      相信会有不少人见过这段代码,但我相信有同样多的人甚至更多的人没有见过.所以我还是要解释一下.很容易把代码变成比较好看的形式如下:
main(a)
{
printf(a,34,a="main(a){printf(a,34,a=%c%s%c,34);}",34);
}
       一般情况下main函数是个比较特殊的函数:它总是int型的,如果不接收参数,则写为int main(void).当然,写得最多的是main().它的含义是一个名字叫做main的函数,它可以接收任意类型和个数的参数,返回值为整形.更标准一些的写法叫做int main(int argc,char *argv[]).argc是一个整数,表示带参运行时参数的个数,*argv是一个字符型的数组的数组.表示参数的名字.例如,一个程序叫做hello.exe.那么可以在shell下输入hello my love,则argc=3,argv[0]="hello",argv[1]="my",argv[2]="love".
       这样看来,main函数的参数只在运行时输入参数才用得着,那么上面程序中main(a)中的a有什么实际意义吗?有.它是一个声明.你可以试着去掉它,编译器就会给你一个这样的错误:未定义的符号'a'在main函数中.那么,它是什么类型呢,答案是,它不是什么类型.它的类型依赖于你的解释.你可以试一下这个程序main(b){printf("%d\n",b=65);},它会输出65,如果把其中的d变成c的话,它就会输出A.当然,上例中a的类型比较明显,它是一个字符串,呃,我想我应该说它是一个以'\0'结尾的字符数组.而在main函数中的a则是数组名,它表示一个指向数组第一个元素的指针.所以编译器会有一条警告信息:不可移动的指针(地址常数)赋值在main函数中.
       我们可以把这个程序再变一下,让它变成更容易理解的样子:
int main(a)
{
printf("main(a){printf(a,34,a=%c%s%c,34);}",34,a,34);
return 0;
}
34是什么意思呢,估计你也可以猜出来,它正是双引号(")的ASCII值.   
[ 本帖最后由 zhponly 于 2007-9-30 15:29 编辑 ]
强哥说,你很胖啊;我说嗯,为明年的经济危机准备的... ...

TOP

main( )小小的递归了下
本人吵架挨吵骂人挨骂支持断点续传!

TOP

不错,很有创意。
打印出来的跟自己一模一样。
我还真没想到过可以这么做

TOP

有个地方很有意思,以前还真没研究过,
就是a = ¨main(a){printf(a,34,a=%c%s%c,34);}¨
那么打印%s时,应该是打这个:main(a){printf(a,34,a=%c%s%c,34);}
递归调用时%c%s%c好像出现了变化?
一次是传递参数的提示符,
另一次被认为是在字符串里的普通字符。
我是这么理解的。编译器到底是怎么认为的呢?
我手头现在没有实验环境,得找机会试试看

[ 本帖最后由 jay.sun 于 2007-10-1 15:11 编辑 ]

TOP

发新话题