为什么 Kernighan 和 Ritchie 不将 int 包含在 main 函数中?
Why don't Kernighan and Ritchie include int for the main functions?
完成的每个示例都是在省略 main "int" 的情况下完成的。为什么会这样,为什么没有它仍然可以编译。 C 编译器是否隐含了 int?
是的。吹掉白皮书上的灰尘,您就会一清二楚。 K&R 就是这样,它发生在 ANSI C 之前。
另一个区别是函数参数。如果我没记错的话是这样的
some_function_name(a,b)
int a;
long float b;
{
printf("%d %lf\n", a, b);
}
几十年来,C 和 C++ 发生了很大变化。
在 Kernighan 和 Ritchie 写作时,int
是默认类型。计算总体上比现在更简单,资源也更受限。语言旨在满足简单的需求。而且它们不是完全设计的;它们是从头开始演变而来的,由不同地方的不同人考虑不同的事情而做出的改变。所以当时的 C 并没有按照现代关于类型安全的思想来设计,也没有严格语法来减少出错的频率。添加到其中的一些功能是人们认为不错且立即有用的东西,不一定是已经分析过其更深层次的影响或未来影响的东西。
语言设计的一个激励因素是简洁。 int
是一种经常使用的类型,因为它旨在成为正在使用的任何机器的“自然”类型,因此将其设为默认值很方便。因此,很多声明默认为int
,所以不需要
现代编译器可能仍然允许缺少 int
,以便仍然可以编译旧代码。通常,这样的编译器会切换到对他们接受的语言方言更加严格。例如,在 GCC 和 Clang 中,您可以指定 -std=c11
以请求更严格地符合 C 标准。 (并且 -std=c17
或 -std=c18
可能很快可用。)编写新程序时,您应该使用此类开关,以便您的编译器对不符合现代标准的代码发出诊断。这将有助于编写更符合当前标准、具有更明确定义的行为并且更有可能在未来更长时间保持有用的代码。
完成的每个示例都是在省略 main "int" 的情况下完成的。为什么会这样,为什么没有它仍然可以编译。 C 编译器是否隐含了 int?
是的。吹掉白皮书上的灰尘,您就会一清二楚。 K&R 就是这样,它发生在 ANSI C 之前。
另一个区别是函数参数。如果我没记错的话是这样的
some_function_name(a,b)
int a;
long float b;
{
printf("%d %lf\n", a, b);
}
几十年来,C 和 C++ 发生了很大变化。
在 Kernighan 和 Ritchie 写作时,int
是默认类型。计算总体上比现在更简单,资源也更受限。语言旨在满足简单的需求。而且它们不是完全设计的;它们是从头开始演变而来的,由不同地方的不同人考虑不同的事情而做出的改变。所以当时的 C 并没有按照现代关于类型安全的思想来设计,也没有严格语法来减少出错的频率。添加到其中的一些功能是人们认为不错且立即有用的东西,不一定是已经分析过其更深层次的影响或未来影响的东西。
语言设计的一个激励因素是简洁。 int
是一种经常使用的类型,因为它旨在成为正在使用的任何机器的“自然”类型,因此将其设为默认值很方便。因此,很多声明默认为int
,所以不需要
现代编译器可能仍然允许缺少 int
,以便仍然可以编译旧代码。通常,这样的编译器会切换到对他们接受的语言方言更加严格。例如,在 GCC 和 Clang 中,您可以指定 -std=c11
以请求更严格地符合 C 标准。 (并且 -std=c17
或 -std=c18
可能很快可用。)编写新程序时,您应该使用此类开关,以便您的编译器对不符合现代标准的代码发出诊断。这将有助于编写更符合当前标准、具有更明确定义的行为并且更有可能在未来更长时间保持有用的代码。