在C中研究quine程序时,我发现main只传递了a
,没有数据类型。以下运行正常并正确输出程序。
main(a){printf(a="main(a){printf(a=%c%s%c,34,a,34);}",34,a,34);}
我想知道,这是如何工作的(不是实际的quine程序),但a
的数据类型是什么?它有什么价值?
答案 0 :(得分:3)
首先,让我告诉您,考虑到托管环境,上述代码也是非标准的,也是非常糟糕的编码方式。你不应该写那样的代码。
此代码使用遗留C的“default-to-int”属性。自C99
以来,该属性已从标准中删除。由于遗留原因,编译器可能会支持并接受这一点。
最有可能的是,习惯获得的值类似于argc
。
答案 1 :(得分:3)
一般函数和main()之间存在差异,这是一种特殊情况。
对于普通函数,您使用的语法将在C的过时版本中起作用,其中类型将被视为"隐式int"你的职能将成为int func (int);
。这个无意义的功能已于16年前从语言中删除,此类程序将不再编译。
至于main()的形式,有一些特殊情况,所有情况都在this answer中引用。
TL;答案的DR:
答案 2 :(得分:1)
什么是数据类型?
这是一个int
。除非明确说明,否则这是C对象被认为是int
的过去的遗产。
它有什么价值?
这是一个更棘手的问题。正在尝试的是将格式字符串的地址分配给a
。在过去,人们经常使用指向int
的指针,反之亦然。但是,从来没有一个规则可以说sizeof(char*) == sizeof(int)
,实际上,在我的编译器(clang 7)中,char*
是8个字节,而int
只是4个字节。这就是为什么你的程序编译(有六个警告)但在运行它时出现seg错误的原因。