C和指针:良好的程序风格和文档将使程序更容易阅读和维护( 二 )


1.它的名字是bcc 。
2.目标文件的名字是file.obj 。
3.当单个源文件被编译并链接时,编译器并不删除目标文件 。
4.在缺省情况下,可执行文件以命令行中第一个源或目标文件名命名,不过你可以使用“-ename”选项把可执行程序文件命名为“name.exe” 。
2.1.2 执行程序的执行过程也需要经历几个阶段 。首先,程序必须载入到内存中 。在宿主环境中(也就是具有操作系统的环境),这个任务由操作系统完成 。那些不是存储在堆栈中的尚未初始化的变量将在这个时候得到初始值 。在独立环境中,程序的载入必须由手工安排,也可能是通过把可执行代码置入只读内存(ROM)来完成 。
然后,程序的执行便开始 。在宿主环境中,通常一个小型的启动程序与程序链接在一起 。它负责处理一系列日常事务,如收集命名行参数以便使程序能够访问它们 。接着,便调用main函数 。
现在,便开始执行程序代码 。在绝大多数机器里,程序将使用一个运行时堆栈(stack),它用于存储函数的局部变量和返回地址 。程序同时也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程中将一直保留它们的值 。
程序执行的最后一个阶段就是程序的终止,它可以由多种不同的原因引起 。“正常”终止就是main函数返回[1] 。有些执行环境允许程序返回一个代码,提示程序为什么停止执行 。在宿主环境中,启动程序将再次取得控制权,并可能执行各种不同的日常任务,如关闭那些程序可能使用过但并未显式关闭的任何文件 。除此之外,程序也可能是由于用户按下break键或者电话连接的挂起而终止,另外也可能是由于在执行过程中出现错误而自行中断 。
2.2 词法规则词法规则就像英语中的拼写规则,决定你在源程序中如何形成单独的字符片段,也就是标记(token) 。
一个ANSI C程序由声明和函数组成 。函数定义了需要执行的工作,而声明则描述了函数和(或)函数将要操作的数据类型(有时候是数据本身) 。注释可以散布于源文件的各个地方 。
2.2.1 字符标准并没有规定C环境必须使用哪种特定的字符集,但它规定字符集必须包括英语所有的大写和小写字母,数字0到9,以及下面这些符号:
! " # % ' ( ) * + , - . / :; < > = ? [ ]^ _ { } | ~换行符用于标志源代码每一行的结束,当正在执行的程序的字符输入就绪时,它也用于标志每个输入行的末尾 。如果运行时环境需要,换行符也可以是一串字符,但它们被当作单个字符处理 。字符集还必须包括空格、水平制表符、垂直制表符和格式反馈字符 。这些字符加上换行符,通常被称作空白字符,因为当它们被打印出来时,在页面上出现的是空白而不是各种记号 。
标准还定义了几个三字母词(trigrph),三字母词就是几个字符的序列,合起来表示另一个字符 。三字母词使C环境可以在某些缺少一些必需字符的字符集上实现 。这里列出了一些三字母词以及它们所代表的字符 。
??( [??< {??= #??) ]??> }??/??! |??’ ^??- ~两个问号开头再尾随一个字符一般不会出现在其他表达形式中,所以把三字母词用这种形式来表示,这样就不致引起误解 。
警告:

尽管三字母词在某些环境中很有用,但对于那些用不着它的人而言,它实在是个令人讨厌的小东西 。之所以选择??这个序列作为每个三字母词的开始是因为它们出现的形式很不自然,但它们仍然隐藏着危险 。你的脑子里一般不会有三字母词这个概念,因为它们极少出现 。所以,当你偶尔书写了一个三字母词时,如下所示:
 
printf("Delete file (are you really sure??): " );
结果输出中将产生]字符,这无疑会令你大吃一惊 。
当你编写某些C源代码时,你在一些上下文环境里想使用某个特定的字符,却可能无法如愿,因为该字符在这个环境里有特别的意义 。例如,双引号 " 用于定界字符串常量,你如何在一个字符串常量内部包含一个双引号呢?K&R C定义了几个转义序列(escape sequence)或字符转义(character escape),用于克服这个难题 。ANSI C在它的基础上又增加了几个转义序列 。转义序列由一个反斜杠加上一或多个其他字符组成 。下面列出的每个转义序列代表反斜杠后面的那个字符,但并未给这个字符增加特别的意义 。


推荐阅读