Kernighan和Ritchie书中的符号常量示例

Kernighan和Ritchie书中的符号常量示例,c,compiler-errors,symbolic-math,kernighan-and-ritchie,C,Compiler Errors,Symbolic Math,Kernighan And Ritchie,我复制了Kernighan和Ritchie 1988年第15页《C编程语言》一书中关于符号常数的脚本示例,如下所示: #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() {

我复制了Kernighan和Ritchie 1988年第15页《C编程语言》一书中关于符号常数的脚本示例,如下所示:

#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));
}
我做错了什么

我做错了什么

你正在读一本完全过时和不正确的书

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

  • 在1989年的第一个C标准中,该书从未正确更新到1),您可以编写
    main()
    而不使用返回类型,但必须编写
    返回0结束时,否则当调用方(操作系统)使用返回值时,程序调用未定义的行为

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

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


1) 根据K&R第二版附录A.1,“本手册描述了1988年10月31日提交给ANSI的草案中规定的C语言,以供批准为‘美国信息系统标准-编程语言C,X3.159-1989’。”

我做错了什么

你正在读一本完全过时和不正确的书

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

  • 在1989年的第一个C标准中,该书从未正确更新到1),您可以编写
    main()
    而不使用返回类型,但必须编写
    返回0结束时,否则当调用方(操作系统)使用返回值时,程序调用未定义的行为

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

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



1) K&R第二版附录A.1中的“本手册描述了1988年10月31日提交给ANSI供批准的草案中规定的C语言,作为“美国信息系统标准-编程语言C,X3.159-1989”。

您确定复制的代码正确吗?您将
UPPER
宏拼写为
UPER
。警告很明显。您对
LOWER
有两种不同的定义,我希望第二种定义实际上是
STEP
。此外,在C99及以上版本中,函数定义应该明确提到它们的返回类型。不要依赖于隐式的
int
。好吧……你的编辑现在完全改变了这个问题——而且它不再起作用了,因为实际上没有任何问题。@Chase。对不起,我打错了。我改正了,还是得到了警告。什么是隐式
int
?你说的是
上部
下部
步骤
。因为这正是我无法理解的:有三个变量是在没有定义类型的情况下定义的,我想知道这是怎么可能的,这可能是最新的一本书。也可以以pdf格式免费提供,或者您可以从该链接购买印刷书籍。这本书对初学者并不友好,但K&R也不友好。你确定你复制的代码正确吗?您将
UPPER
宏拼写为
UPER
。警告很明显。您对
LOWER
有两种不同的定义,我希望第二种定义实际上是
STEP
。此外,在C99及以上版本中,函数定义应该明确提到它们的返回类型。不要依赖于隐式的
int
。好吧……你的编辑现在完全改变了这个问题——而且它不再起作用了,因为实际上没有任何问题。@Chase。对不起,我打错了。我改正了,还是得到了警告。什么是隐式
int
?你说的是
上部
下部
步骤
。因为这正是我无法理解的:有三个变量是在没有定义类型的情况下定义的,我想知道这是怎么可能的,这可能是最新的一本书。也可以以pdf格式免费提供,或者您可以从该链接购买印刷书籍。这本书对初学者并不友好,但K&R也不友好。@EricPostpischil第二版声称已更新为C90。但是
main(){}
不带
返回0在C90中始终是未定义的行为。那么,它到底是如何不正确的呢?@EricPostphil K&R第一版于1978年为标准前C版出版。1988年的第二版在附录A.1中声明了这一点“本手册描述了1988年10月31日提交给ANSI的草案中规定的C语言,该草案作为`美国信息系统标准-编程语言C,X3.159-1989'批准。'本手册是对拟议标准的解释,而不是标准本身,尽管已经注意使其成为语言的可靠指南。“X3.159草案和C89之间的返回类型行为没有变化。我非常确定草案和ANSI C89之间的总体变化不多。此外,我对K&R拥抱者回应事实感到非常厌倦
fahr_symbolic.c:9:1: warning: type specifier missing, defaults to 'int'
      [-Wimplicit-int]
main()
^
1 warning generated.