ANSI C 标准化过程的一个目标是生成 K&R C 的超集(第一个发布的标准),吸收了许多随后引入的非官方功能。然而,标准委员会也包含了一些新特性,比如从 C++ 编程语言借鉴来的函数原型和更强大的预处理器。参数声明的语法也被改变以反映 C++ 风格。
这让我想到它们之间存在差异。然而,我没有看到 K&R C 和 ANSI C 之间的比较。是否有这样的文档?如果没有,主要区别是什么?
编辑:我相信 K&R 书上写着“ANSI C”。至少我家里的版本是这样的。那么现在可能没有什么区别了吧?
ANSI C 标准化过程的一个目标是生成 K&R C 的超集(第一个发布的标准),吸收了许多随后引入的非官方功能。然而,标准委员会也包含了一些新特性,比如从 C++ 编程语言借鉴来的函数原型和更强大的预处理器。参数声明的语法也被改变以反映 C++ 风格。
这让我想到它们之间存在差异。然而,我没有看到 K&R C 和 ANSI C 之间的比较。是否有这样的文档?如果没有,主要区别是什么?
编辑:我相信 K&R 书上写着“ANSI C”。至少我家里的版本是这样的。那么现在可能没有什么区别了吧?
关于“K&R C”的定义可能存在一些混淆。这个术语指的是《C程序设计语言》第一版中记录的语言。粗略地说,它是贝尔实验室C编译器大约在1978年左右使用的输入语言。
Kernighan和Ritchie参与了ANSI标准化过程。 "ANSI C"方言取代了“K&R C”,随后的《C程序设计语言》版本采用了ANSI惯例。“K&R C”是一种“死亡语言”,除了某些编译器仍接受旧代码外,已经不再使用。
函数原型是K&R C和C89之间最明显的变化,但还有很多其他变化。标准化C库也做了很多重要的工作。尽管标准C库是现有实践的编码,但它编码了多个现有实践,这使得它更加困难。P.J. Plauger的书《The Standard C Library》是一个很好的参考,并且还讲述了图书馆为什么以其目前的方式结束的幕后细节。
ANSI / ISO标准C在大多数方面与K&R C非常相似。它旨在大多数现有C代码都应该在ANSI编译器上构建而不需要太多更改。然而,在预标准时代,语言的语义对于每个编译器供应商都是开放的解释。 ANSI C引入了一种语言语义的通用描述,将所有编译器置于同等地位。现在,大约20年后,我们很容易认为这是一个重要的成就。
基本上,如果您没有要维护的预先标准C代码库,那么您应该庆幸不必担心它。如果您确实有一个预先标准的代码库要维护,或者更糟的是,如果您正在试图将旧程序升级到更现代的标准,则我对您表示同情。
有一些细微差别,但我认为K&R的后续版本是针对ANSI C的,因此现在没有真正的区别了。
" C Classic "(缺乏更好的术语)定义函数的方式略有不同,即
int f( p, q, r )
int p, float q, double r;
{
// Code goes here
}
我认为另一个区别在于函数原型。原型不能-事实上也不可能-带有参数或类型列表。在ANSI C中,它们可以。
int p; float q; double r;
或者int p, q, r;
。 - Seva Alekseyev另一个不同之处在于,函数的返回类型和参数类型不需要定义。它们将被假定为整数。
f(x)
{
return x + 1;
}
并且
int f(x)
int x;
{
return x + 1;
}
是完全相同的。
unsigned long foo (char* fmt, double data)
{
/*body of foo */
}
>>
的左操作数,也没有被用作/
、%
或任何比较运算符的任一操作数。顺便说一下,标准的理由之一是小的无符号类型升级为有符号类型。