读书笔记系列之《C语言程序设计现代方法》----第二章

x33g5p2x  于2022-02-15 转载在 其他  
字(1.4k)|赞(0)|评价(0)|浏览(264)

第二章 C语言基本概念

2.1 编写一个简单的C程序

2.1.1 编译和链接

  • 预处理:首先程序会被提交给预处理器。预处理器执行以#开头的指令(通常称为指令)。预处理器有点类似于编辑器,它可以给程序添加内容,也可以对程序进行修改(比如修改主函数的名字)。
  • 编译。修改后的程序现在可以进入编译器了。编译器会把程序翻译成机器指令(即目标代码)。然而,这样的程序还是不可以运行的。
  • 链接。再最后一个步骤中,链接器把由编译器产生的目标代码和所需的其他附加代码整合在一起,这样才最终产生了完全可执行的程序。这些附加代码包括程序中用到的库函数。

2.2.1指令

指令:我们把预处理器执行的命令称为指令。所有指令都是以字符#开始的。指令默认只占一行,每条指令的结尾没有分号或者其它特殊标记。

2.2.2函数

一个C程序可以包含多个函数,但是只有main()函数是必须有的,在执行程序时系统会自动调用main()函数。

return 0;的作用:

  1. 使main()函数终止(从而结束程序)。
  2. 指出main函数的返回值是0。

注意:如果main()函数的末尾没有return语句,程序仍然能终止。但是许多编译器会产生一条警告信息(因为函数应该返回一个整数却没有这么做)。

2.4.3赋值

当我们把一个包含小数点的常量赋值给float型变量时,最好在常量后面加一个字符f(代表float)。

2.7标识符

某些编译器把特定的标识符(如asm)视为附加关键字。属于标准库的标识符也是受限的。误用这些名字可能会导致编译或链接出错。以下划线开头的标识符也是受限的。

问与答

  1. 问:在某些C语言书中,main()函数的结尾使用的是exit(0)而不是return 0,二者是否一样呢?

答:当出现在main()函数中使,这两种语句使完全等价的,二者都终止程序执行,并且向操作系统返回0值。使用哪种语句完全依据个人喜好而定。

  1. 问:如果main()函数末尾没有return语句会产生什么的后果?

答:return语句不是必须的;如果没有return语句,程序一样会终止。在C89中,返回给操作系统的值是未定义的。在C99中,如果main()函数声明中的返回类型是int,程序会向操作系统返回0;否则会返回一个不确定的值。

  1. 问:编译器是完全移除注释还是用空格替换掉注释呢?

答:一些早期的编译器会删除每条注释中的所有字段,使得语句

a/**/b = 0;

理解成

ab = 0;

然而,依据C标准,编译器必须用一个空格字符替换每条注释语句,因此上面提到的技巧并不可行。

我们实际上会得到下面的语句:

a b = 0;

  1. 问:对标识符的长度真的没有限制吗?

答:是,又不是。C89标准声明标识符可以任意长,但却值要求编译器记住前31个字符(C99中是63个字符)。因此,如果两个名字的前31个字符都相同,编译器可能无法区别它们。

更复杂的情况是,C标准对于外部链接的标识符又特殊的规定,而大多数函数名都是这类标识符。因为链接器必须能识别这些名字,而一些早期的链接器又只能处理短名字,所以在C99中只有前6个字符才是有效的。此外,还不区分字母的大小写。因此ABCDEFG和abcdefg可能被作为相同的名字处理。(C99中,前31个字符有效,且字母区分大小写。)

大多数编译器和链接器都比标准所要求的宽松,所以实际使用中这些规则都不是问题,不要担心标识符太长,还是不要把它们定义的太短吧。

相关文章