在学习C语言的quine程序时,我发现主函数只传递了a
,没有数据类型。下面的程序可以正常运行并正确输出结果。
main(a){printf(a="main(a){printf(a=%c%s%c,34,a,34);}",34,a,34);}
我想知道,这个程序是如何工作的(不是实际的quine程序),但是a
的数据类型是什么?它得到了什么值?
在学习C语言的quine程序时,我发现主函数只传递了a
,没有数据类型。下面的程序可以正常运行并正确输出结果。
main(a){printf(a="main(a){printf(a=%c%s%c,34,a,34);}",34,a,34);}
我想知道,这个程序是如何工作的(不是实际的quine程序),但是a
的数据类型是什么?它得到了什么值?
一般函数和main()函数是不同的,main()是一个特殊情况。
对于普通函数而言,在过时版本的C中,你使用的语法会被视为“implicit int”,你的函数将变成int func (int);
。这种无意义的特性在16年前就被从该语言中移除了,这样的程序将不再编译。
至于main()的形式,有一些特殊情况,在这个答案中详细描述了所有情况。
该回答的TL;DR:
a的数据类型是什么?
它是一个int
。这是旧时代的遗留问题,当时C对象被认为是int
,除非明确声明。
它得到了什么值?
这是一个更棘手的问题。试图将格式字符串的地址赋给a
。在过去,人们经常将指针分配给int
,反之亦然。但是,从来没有规定说sizeof(char*) == sizeof(int)
,实际上,在我的编译器(clang 7)中,char*
是8字节,而int
只有4字节。这就是为什么你的程序可以编译(带有六个警告),但在运行时会导致段错误。
int
。顺便说一下,该程序表现出未定义的行为,因为你将一个char*
赋值给了一个int
。 - Spikatrix"a=%c%s%c"
。至少那部分没有编译,我非常确定。 - ryyker