【问题标题】:Symbolic constant example in Kernighan and Ritchie bookKernighan 和 Ritchie 书中的符号常数示例
【发布时间】:2021-01-13 07:45:26
【问题描述】:

我复制了 Kernighan 和 Ritchie 1988 年出版的 The C Programming Language 一书第 15 页关于符号常量的脚本示例如下:

#include <stdio.h>

#define LOWER 0    /* lower limit of table */
#define UPPER 300  /* upper limit */
#define STEP 20    /* step size*/

/* print Fahrenheit-Celsius table */

main()
{
    int fahr;

    for (fahr = LOWER; fahr <= UPPER; fahr = fahr + STEP)
        printf("%3d %6.1f\n", fahr, (5.0 / 9.0) * (fahr - 32));
}

但是,当我运行 gcc script.c 时,我得到:

fahr_symbolic.c:9:1: warning: type specifier missing, defaults to 'int'
      [-Wimplicit-int]
main()
^
1 warning generated.

我做错了什么?

【问题讨论】:

  • 您确定您复制的代码正确吗?您将UPPER 宏拼写为UPER。很明显的警告。 LOWER 有两个不同的定义,我希望第二个定义实际上是 STEP
  • 此外,在 C99 及更高版本中 - 函数定义应明确提及其返回类型。不要依赖隐含的int
  • 好吧....您的编辑现在完全改变了问题 - 它不再有任何意义,因为实际上没有任何问题。
  • @Chase。对不起,错别字。我更正了,仍然收到警告。隐含的int 是什么意思?你是在说UPPERLOWERSTEP。因为这正是我无法理解的:在没有定义类型的情况下定义了这三个变量,我想知道这怎么可能
  • Modern C 可能是最新的书。也可以以 pdf 格式免费提供,或者您可以从该链接购买印刷书籍。这不是一本真正适合初学者的书,但 K&R 也不是。

标签: c compiler-errors symbolic-math kernighan-and-ritchie


【解决方案1】:

我做错了什么?

您正在阅读一本完全过时且不正确的书。

  • 在本书所针对的准标准 C 中,你可以写任何东西,因为没有标准。例如main() 没有返回类型或在末尾跳过return 0;

  • 在 1989 年的第一个 C 标准中,本书从未正确更新为1),您可以编写没有返回类型的 main(),但您将不得不最后写return 0;,否则当调用者(操作系统)使用返回值时程序会调用未定义的行为。

  • 在 1999 年更新的 C 标准中,“隐式 int”main() 已从语言中删除,您必须编写 int main (void)。但是,在这个版本的语言中,您可以跳过 main() 中的 return 0,这是您以前无法做到的。

2018 年的当前 C 语言在这方面的行为与 1999 年的版本相同。但 K&R 中的代码从未对任何版本的标准化 C 有效。


1) 来自 K&R 第 2 版的附录 A.1 “本手册描述了由 1988 年 10 月 31 日提交给 ANSI 的草案指定的 C 语言,该草案被批准为“美国信息系统标准” - 编程语言 C,X3.159-1989。'"

【讨论】:

  • @EricPostpischil 第 2 版声称已更新到 C90。但是没有return 0;main() {} 在C90 中始终是未定义的行为。那么究竟怎么算不正确呢?
  • @EricPostpischil K&R 第 1 版于 1978 年发布,用于预标准 C。
  • 1988 年的第 2 版在附录 A.1 中声明了这一点“本手册描述了由 1988 年 10 月 31 日提交给 ANSI 的草案指定的 C 语言,该草案被批准为‘美国信息系统标准 -编程语言 C,X3.159-1989。'' 本手册是对拟议标准的解释,而不是标准本身,尽管已注意使其成为该语言的可靠指南。 X3.159 草案和 C89 之间的返回类型行为没有变化。我很确定草案和 ANSI C89 总体上没有太多变化。
  • 另外,我厌倦了 K&R 拥抱者,他们对事实论据做出回应,为什么这本书中的某些内容总是错误的,即使在过去,“不,这是一本好书”,也没有提供任何论据。如果早在 1988 年就有很多事实和拼写错误。贝尔实验室在某处为这本书提供了一个很大的勘误表,但它似乎已经从互联网上消失了。
  • 你是对的,我的版本有误,如果进行编辑,我将撤回我的投票。但是,我仍然不同意您在 K&R 表达的激烈程度;它并不比你不赞成的“拥抱”更合适。用现代标准来判断几十年前的艰苦和长期工作是不恰当的。那时你会做得更好吗?在相同的工作量下?具有相同的目标和时间限制?您无法从书中复制文本并将其粘贴到源文件中进行测试。即使可以,他们当时使用的编译器也可能会接受它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多