第1单元Hel,C++ 对在标识符中最多可以使用多少个字符的规定各不相同,ANSI标准规定编译器应识别标识 符的前6个字符,而Ⅴ isual C++编译器允许在程序中使用长达247个字符的标识符!在标识 符中恰当运用下划线,大、小写字母混用以及使用较长的名字都有助于提高程序的可读性。 例如在一个人事管理软件中,用函数名 read employee file()(读职工档案)、变量名 Employee Count(职工人数)等就要比用函数名f()、变量名n等清楚得多。 在 Visual C++中,有下列关键词 asm, auto, bad cast, bad typed, bool, break, case, catch, char, class, const except, extern, explicit false, finally, float, for, friend, goto, if, inline, int, long, mutable, namespace, new, operator, private, protected, public, register reinterpret cast, return, short, signed, sizeof, static, static cast, struct, switch, template, this, throw, try, type info, typedef, typeid, union, unsigned, using, virtual. void volatile. while. xalloc 用于表示C++本身的特定成份,具有相应的语义。程序员在命名变量、数组和函数的名称时, 不能使用这些标识符 另外,C++还使用了下列12个标识符作为编译预处理的命令单词 define, elif, else, endif, error, if, ifdef, ifndef, include, line, progma, undef 并赋予了特定含义。程序员在命名变量、数组和函数时也不要使用它们。 在C++字符集中标点和特殊字符有各种用途,从组织程序文本到定义编译器或编译的程 序的执行功能。有些标点符号也是运算符(参见第3单元“基本数据类型与表达式”中的有 关内容),编译器可从上下文确定它们的用途。C++的标点有 这些字符在C++中均具有特定含义。 15.2注解 C艹+的注解有两种形式,一种以两个斜杠符“∥”起头,直至行末。一种是用斜线星号 组合“/”和“*/”括起的任意文字(但不能再包含“*”和“*/”,即注解不能嵌套), 多用于注解篇幅多于一行的情况。注解可以出现在空白字符允许出现的任何地方,编译器把 注解作为一个空白字符处理 恰当使用注解可以使程序容易阅读 15.3源程序 份C++源程序由一个或多个源代码文件构成。C++源程序中包括命令、编译指示、声 明、定义、注解和函数等内容。为了使程序的结构清晰,通常的做法是在一个源代码文件中 放置变量、类型、宏和类等的声明(称为头文件,后缀为H),然后在另一个源代码文件中 引用这些变量(称为源程序文件,后缀为CPP)。采用这种方式编写的程序,很容易查找和 修改各类声明
第 1 单元 Hello,C++! - 6 - 对在标识符中最多可以使用多少个字符的规定各不相同, ANSI 标准规定编译器应识别标识 符的前 6 个字符, 而 Visual C++编译器允许在程序中使用长达 247 个字符的标识符!在标识 符中恰当运用下划线, 大、小写字母混用以及使用较长的名字都有助于提高程序的可读性。 例如在一个人事管理软件中, 用函数名 read_employee_file ( ) (读职工档案)、变量名 EmployeeCount (职工人数) 等就要比用函数名 f ( )、变量名 n 等清楚得多。 在 Visual C++中,有下列关键词: asm, auto, bad_cast, bad_typed, bool, break, case, catch, char, class, const, const_cast, continue, default, delete, do, double, dynamic_cast, else, enum, except, extern, explicit, false, finally, float, for, friend, goto, if, inline, int, long, mutable, namespace, new, operator, private, protected, public, register, reinterpret_cast, return, short, signed, sizeof, static, static_cast, struct, switch, template, this, throw, try, type_info, typedef, typeid, union, unsigned, using, virtual, void, volatile, while, xalloc 用于表示C++本身的特定成份, 具有相应的语义。程序员在命名变量、数组和函数的名称时, 不能使用这些标识符。 另外, C++还使用了下列 12 个标识符作为编译预处理的命令单词: define, elif, else, endif, error, if, ifdef, ifndef, include, line, progma, undef 并赋予了特定含义。程序员在命名变量、数组和函数时也不要使用它们。 在 C++字符集中标点和特殊字符有各种用途,从组织程序文本到定义编译器或编译的程 序的执行功能。有些标点符号也是运算符 (参见第 3 单元“基本数据类型与表达式”中的有 关内容),编译器可从上下文确定它们的用途。C++的标点有 [ ] ( ) { } * & , : = ; ... # 这些字符在 C++中均具有特定含义。 1.5.2 注解 C++的注解有两种形式,一种以两个斜杠符“//”起头, 直至行末。一种是用斜线星号 组合 “/*”和“*/”括起的任意文字(但不能再包含“/*”和“*/”,即注解不能嵌套), 多用于注解篇幅多于一行的情况。注解可以出现在空白字符允许出现的任何地方,编译器把 注解作为一个空白字符处理。 恰当使用注解可以使程序容易阅读。 1.5.3 源程序 一份 C++源程序由一个或多个源代码文件构成。C++源程序中包括命令、编译指示、声 明、定义、注解和函数等内容。为了使程序的结构清晰,通常的做法是在一个源代码文件中 放置变量、类型、宏和类等的声明(称为头文件,后缀为.H),然后在另一个源代码文件中 引用这些变量(称为源程序文件,后缀为.CPP)。采用这种方式编写的程序,很容易查找和 修改各类声明
第1单元Hel,C++ 15.4编译预处理 将程序编译的过程分为预处理和正式编译两个步骤是C++的一大特点。在编译C++程序 时,编译器中的预处理模块首先根据预处理命令对源程序进行适当的加工,然后才进行正式 编译。 预处理命令均以符号“#”开头,且在一行中只能书写一条预处理命令(过长的预处理命 令可以在使用续行标志“\”后续写在下一行上),且结束时不能使用语句结束符(分号“;”)。 C++中有3种主要编译预处理命令:宏定义、文件包含和条件编译。下面先介绍其中 的前两种,条件编译将在第4单元中介绍。 1.宏定义 无参宏定义通常用来定义符号常数,其格式为: # define<宏名〉<替换序列〉 其中<宏名>是一个标识符。为了和变量有所区别,习惯上在为无参宏起名时只使用大写字 母。例如 #define pi 3. 14159 该宏定义命令为常量3.14159起了一个符号化的名字PI。这样,在该宏定义命令之后的程 序中,均可以使用符号常数PI表示数值3.14159,例如 PlEkrskr 使用符号常数的程序可读性好,易于阅读理解。另外,将程序中的常量用符号常数表示 也有利于程序的调试和修改。例如,程序中分别使用了两个符号常数,它们的值碰巧相同 #define MaX number #define LIne le 以后如果发现需要将其中的一个修改为其他数值,则只须修改上面的宏定义即可。但是如果 不使用宏定义,则需逐个查出程序中所有数值80,一一判断是否是需要修改的那一个。不 但费事,而且容易出错。 应该说明的是用宏命令定义的符号常数不是变量,象 LINE LEN =100. 这样的用法是错误的。其实,宏定义命令的真正含义是要求编译程序在对源程序进行预处理 时,将源程序中所有的符号名“ MAX NUMBER”和“ LINE LEN”(但不包括出现在注解与字符 串中的“ MAX NUMBER”和“ LINE LEN”)分别替换为字符序列“80”。因此到了正式编译时, 符号名“ LINE LEN”已经不存在了,语句“ LINE LEN=100;”已经变为“80=100;”,由 于赋值运算符的左边不是变量而是一个常数80,显然这是一个错误的赋值表达式语句 在定义宏时还可以加上参数,这就构成了带参数的宏 # define<宏名>(<参数表》)<带有参数的替换序列〉 例如
第 1 单元 Hello,C++! - 7 - 1.5.4 编译预处理 将程序编译的过程分为预处理和正式编译两个步骤是C++的一大特点。在编译C++程序 时, 编译器中的预处理模块首先根据预处理命令对源程序进行适当的加工, 然后才进行正式 编译。 预处理命令均以符号“#”开头,且在一行中只能书写一条预处理命令 (过长的预处理命 令可以在使用续行标志“\”后续写在下一行上), 且结束时不能使用语句结束符(分号“;”)。 C++中有 3 种主要编译预处理命令:宏定义、文件包含和条件编译。下面先介绍其中 的前两种,条件编译将在第 4 单元中介绍。 1. 宏定义 无参宏定义通常用来定义符号常数, 其格式为: #define <宏名> <替换序列> 其中<宏名>是一个标识符。为了和变量有所区别, 习惯上在为无参宏起名时只使用大写字 母。例如: #define PI 3.14159 该宏定义命令为常量 3.14159 起了一个符号化的名字 PI。这样,在该宏定义命令之后的程 序中,均可以使用符号常数 PI 表示数值 3.14159,例如: s = PI*r*r; 使用符号常数的程序可读性好, 易于阅读理解。另外, 将程序中的常量用符号常数表示 也有利于程序的调试和修改。例如, 程序中分别使用了两个符号常数, 它们的值碰巧相同: #define MAX_NUMBER 80 #define LINE_LEN 80 以后如果发现需要将其中的一个修改为其他数值, 则只须修改上面的宏定义即可。但是如果 不使用宏定义, 则需逐个查出程序中所有数值 80, 一一判断是否是需要修改的那一个。不 但费事, 而且容易出错。 应该说明的是用宏命令定义的符号常数不是变量, 象 LINE_LEN = 100; 这样的用法是错误的。其实,宏定义命令的真正含义是要求编译程序在对源程序进行预处理 时, 将源程序中所有的符号名“MAX_NUMBER”和“LINE_LEN” (但不包括出现在注解与字符 串中的“MAX_NUMBER”和“LINE_LEN”) 分别替换为字符序列“80”。因此到了正式编译时, 符号名“LINE_LEN”已经不存在了,语句“LINE_LEN = 100;”已经变为“80 = 100;”, 由 于赋值运算符的左边不是变量而是一个常数 80, 显然这是一个错误的赋值表达式语句。 在定义宏时还可以加上参数, 这就构成了带参数的宏: #define <宏名>(<参数表>) <带有参数的替换序列> 例如