9

问题来了,C (K&R C) 是怎样的?问题是关于 C 生命的前十年或二十年?

我知道,我从我大学的一位教授那里听说,C 没有我们今天使用 ANSI C 获得的标准库。他们曾经在包装的汇编中编写 IO 例程!第二件事是 K&R 的书,是程序员读过的最好的书之一,这是我的教授告诉我们的 :)

我想了解更多关于优秀 C 的信息。例如,与 ANSI C 相比,你知道它有什么主要区别,或者 C 是如何改变程序员对编程的看法的?


仅作记录,我在主要阅读了这两篇论文后提出了这个问题:

我知道,它们是关于 C++ 的!这就是为什么我想更多地了解 C,因为这两篇论文是关于C++ 是如何从 C 中诞生的。我现在问的是它之前的样子。感谢Lazarus指出 K&R 的第一版,但我仍然很想从 SO 大师那里了解更多关于 C 的信息;)

4

11 回答 11

12

好吧,首先,没有那个函数原型垃圾。main()如此宣布:

/* int */ main(c,v)
int c;
char *v[];
{
    /* Do something here. */
}

也没有那种花哨的双斜线评论。也不枚举。真男人用过#define

啊,让我热泪盈眶,想起过去的美好时光:-)

于 2009-09-23T15:00:59.293 回答
7

查看贝尔实验室的 K&R 书籍的“主页”,特别是标题“该语言的历史可追溯至“C 语言的发展”,来自 HOPL II,1993 年”

于 2009-09-23T14:57:22.513 回答
3

根据个人经验,我的前两个 C 编译器/开发环境是 DeSmet C(16 位 MS-DOS 命令行)和 Lattice C(也是 16 位 MS-DOS 命令行)。DeSmet C 带有自己的文本编辑器 ( see.exe) 和库——非标准函数,如scr_rowcol()定位光标。然而,即使在那时,也有某些标准功能,例如printf(), fopen() fread(), fwrite() and fclose().

当时有趣的特点之一是您可以在四种基本记忆模型之间进行选择——S、P、D 和 L。多年来,其他的变化来来去去,但这些是最重要的。S 是“小型”模型,代码和数据都是 16 位寻址,每个都限制为 64K。L 使用 24 位寻址,即 16 位段寄存器和 16 位偏移寄存器来计算地址,将地址空间限制为 1024K。当然,在 16 位 DOS 世界中,您受限于 640K 的物理限制。P 和 D 是两种模式之间的折衷方案,其中 P 允许 24 位 (640K) 代码和 64K 数据,而 D 允许 64K 代码和 640K 数据寻址。

于 2009-09-23T14:54:56.950 回答
3

维基百科有一些关于这个主题的信息。

于 2009-09-23T14:55:48.897 回答
3

以下是使用 ANSI C 更改为更好的代码示例:

double GetSomeInfo(x)
int x;
{
    return (double)x / 2.0;
}

int PerformFabulousTrick(x, y, z)
int x, int y;
double z;
{
    /* here we go */
    z = GetSomeInfo(x, y); /* argument matching?  what's that? */
    return (int)z;
}
于 2009-09-23T15:01:36.830 回答
3

1986 年,我第一次开始在 VAX/VMS 上使用 C。以下是我记得的差异:

  • 没有原型——函数定义和声明被写成
    int main() /* no void 指定空参数列表 */
    {
      无效的富();/* 声明中没有参数列表 */
      ...
    }
    ...
    无效 foo(x,y)
      诠释 x;
      双 y;
    {
      ...
    }
  • 没有通用(void)指针类型;而是返回所有*alloc()函数char *(这也是为什么有些人仍然强制转换 malloc() 的返回值的部分原因;使用 ANSI 之前的编译器,您必须这样做);

  • 可变参数函数的处理方式不同;不需要任何固定参数,并且头文件的名称不同(varargs.h 而不是 stdarg.h);

  • 多年来,math.h 中添加了很多东西,尤其是在 C99 标准中80 年代的老式 C 并不是数字工作的最佳工具;

  • 图书馆没有标准化;几乎所有的实现都有一个版本的 stdio、math、string、ctype 等,但不同实现的内容不一定相同。

于 2009-09-23T15:40:08.077 回答
2

看看版本 6 Unix 内核的代码——这就是 C 的样子!

请参阅Lion 对 Unix 第 6 版( Amazon ) 的评论。

此外,如果您告诉我们您的年龄会更容易 - 您的个人资料显示您是 22 岁,所以您询问的是 1987 年之前的代码。

还要考虑: 1984 年的 Unix 编程环境

于 2009-09-23T16:12:46.217 回答
2

虽然出于显而易见的原因,核心语言出现在图书馆之前,但如果你拿到 1978 年出版的 K&R 的第一版副本,你会发现图书馆非常熟悉。此外,C 最初用于 Unix 开发,并且该库与操作系统的 I/O 服务挂钩。所以我认为你教授的断言可能是杜撰的。

最明显的区别是定义函数的方式:

VOID* copy( dest, src, len )
    VOID* dest ;
    VOID* src ;
    int len ;
{
   ...
}

代替:

void* copy( void* dest, void* src, int len )
{
    ... 
}

例如。注意 VOID 的使用;K&R C 没有 void 类型,通常 VOID 是定义为 int* 的宏。不用说,为了让它工作,早期编译器中的类型检查是允许的。从实际的角度来看,C 验证代码的能力很差(主要是由于缺乏函数原型和弱类型检查),因此 lint 等工具很受欢迎。

1978 年,该语言的定义K&R 书。1989 年被 ANSI 标准化,后来被 ISO 标准化,第 2 版不再被视为语言定义,以 ANSI C 为基础。它仍然是 C IMO 最好的书,总体上是一本很好的编程书籍。

维基百科上有一个简短的描述,可能会有所帮助。最好的办法是获得 K&R 的第一版,但是,我不会用它来学习 C,而是获得第二版。为了那个原因。

于 2009-09-23T19:44:03.560 回答
0

我在 1980 年代初开始使用 C。正如有人指出的那样,我现在和那时看到的主要区别是早期的 C 没有函数原型。最早使用的 CI 具有与今天几乎相同的标准库。如果有一段时间 C 没有 printf 或 fwrite,那甚至早于我的时代!我从最初的 K&R 书中学习了 C。这确实是一部经典之作,证明了技术娴熟的人也可以成为优秀的作家。我相信你可以在亚马逊上找到它。

于 2009-09-23T16:57:15.213 回答
0

您可能会从您正在寻找的时间段中查看模糊的 C 竞赛条目。

于 2009-09-23T18:28:37.377 回答
0

16 位整数在过去很常见。

于 2010-11-29T22:08:55.133 回答