我们可以省略函数参数的数据类型吗?

时间:2015-08-13 14:14:12

标签: c

在C中研究quine程序时,我发现main只传递了a,没有数据类型。以下运行正常并正确输出程序。

main(a){printf(a="main(a){printf(a=%c%s%c,34,a,34);}",34,a,34);}

我想知道,这是如何工作的(不是实际的quine程序),但a的数据类型是什么?它有什么价值?

3 个答案:

答案 0 :(得分:3)

首先,让我告诉您,考虑到托管环境,上述代码也是非标准的,也是非常糟糕的编码方式。你不应该写那样的代码。

此代码使用遗留C的“default-to-int”属性。自C99以来,该属性已从标准中删除。由于遗留原因,编译器可能会支持并接受这一点。

最有可能的是,习惯获得的值类似于argc

答案 1 :(得分:3)

一般函数和main()之间存在差异,这是一种特殊情况。

对于普通函数,您使用的语法将在C的过时版本中起作用,其中类型将被视为"隐式int"你的职能将成为int func (int);。这个无意义的功能已于16年前从语言中删除,此类程序将不再编译。

至于main()的形式,有一些特殊情况,所有情况都在this answer中引用。

TL;答案的DR:

  • 代码中main的形式是而不是允许托管的C90实现。
  • 任何其他托管C实现都不允许(很可能不是,标准不明确)。
  • 该代码可能对某些不起眼的独立实现有效。然而,在这样的背景下,代码并没有意义。
  • 或者很可能:代码是非标准的,根本不会在任何符合标准的编译器上编译。

答案 2 :(得分:1)

  

什么是数据类型?

这是一个int。除非明确说明,否则这是C对象被认为是int的过去的遗产。

  

它有什么价值?

这是一个更棘手的问题。正在尝试的是将格式字符串的地址分配给a。在过去,人们经常使用指向int的指针,反之亦然。但是,从来没有一个规则可以说sizeof(char*) == sizeof(int),实际上,在我的编译器(clang 7)中,char*是8个字节,而int只是4个字节。这就是为什么你的程序编译(有六个警告)但在运行它时出现seg错误的原因。