复制内容到剪贴板
代码:
这句代码出自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 编辑 ]