【问题标题】:Is there any documentation for pre-K&R c?是否有任何关于 pre-K&R c 的文档?
【发布时间】:2022-01-21 04:42:49
【问题描述】:

我正在玩一个在线 PDP11 模拟器 (link),并正在查看其 FAQ 的编程部分。

它说的是在模拟器上用 C 语言编程:

你需要编写pre-K&R C,这与现代C有很大不同

我相信这是指The C Programming Language出版之前使用的C 版本。我试图通过阅读我可以在模拟器的文件系统中找到的稀疏 C 文件来理解这个版本,但即使是简单的事情,比如声明 argcargv 也让我望而却步。我在网上也找不到任何关于它的信息。

是否有任何当时或事后编写的关于“pre-K&R”C 的文档?

【问题讨论】:

  • 我认为他们很困惑,意思是 pre-ANSI C。K&R 是原始 C。
  • 据我所知,没有long int 没有unsigned int +==+(其他相同),没有标准库,没有预处理器,没有#include,没有structunion
  • @Barmar 之前有 K&R C。
  • 然后,如果您看到头文件,您就会看到“迟到的”C。 C 的原始第一个版本不支持包含文件:)。 Mike Lesk 在 1974 年或 5 年实现并添加了预处理器

标签: c pdp-11


【解决方案1】:

对于这类问题,我的首选来源是已故丹尼斯·里奇 (Dennis Ritchie) 的存档网页:

https://www.bell-labs.com/usr/dmr/www/

从那里单击一下即可访问这本由 Ritchie 自己编写的早期 C 参考手册:

https://www.bell-labs.com/usr/dmr/www/cman.pdf

这确实是“pre-K&R C”,具有时代错误,例如 =+ 而不是 +=

这与 K&R 书中的附录 A 以更新形式出现的参考手册相同。

在同一页面上是该参考手册的其他几个版本的链接,以及关于two early versions of Ritchie's compiler 的注释甚至源代码。这些看起来很有趣,尽管正如页面所述,“您将无法使用当今的编译器编译它们”。

有一个完整的 Stack Exchange 网站专门用于解决此类问题:https://retrocomputing.stackexchange.com/

【讨论】:

  • 那些运营商非常糟糕。 x=-1 应该被解释为x=x-1 还是x=(-1)
  • @klutt 是的,这就是问题所在,这正是它们被更改的原因。
【解决方案2】:

Steve Summit 回答了从何处获取文档的问题。所以这篇文章旨在总结与现代 C 的显着差异

函数参数的类型完全不同。它们没有在括号内指定

void foo(a, b)
    int a; 
    float b;
{
    // Function body
}

没有行 cmets,例如 //。仅限/* */

orand 不符合逻辑。运算符&&|| 不存在。而是使用了位运算符&|

=--= 的含义相同,这会导致与例如x=-1 的歧义。

没有void 指针。改为使用char 指针。

不能在 for 头中声明变量,所以必须写:

int i=0; 
for(i=0; i<N; ++i)

= 仅用于分配而不是初始化。那些是这样完成的:int x 3;

隐式int。这在现代 C 中仍然有效。不同之处在于没有(理智的)程序员不再使用它。这个:

foo 3;

实际上等价于

int foo = 3;

没有const 限定符

【讨论】:

  • 除了=+||/&amp;&amp;,您列出的所有内容都同样适用于“pre-K&R C”和实际的 K&R(又名 pre-ANSI)C。当然,这里没有硬性描述。例如,V6 参考手册中描述的 C 完全没有结构; K&R1 中描述的 C 具有无法传递或分配的结构;但不久之后编译器就支持结构传递和分配就好了。
猜你喜欢
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2010-11-24
  • 2012-02-15
  • 1970-01-01
  • 2013-06-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多