第五章变量和常量 5.1从类型到变量 5.1.1公孙龙的“白马非马” 5.1.2定义变量 5.1.3如何为变量命名 5.1.4如何初始化变量 5.1.4.1什么时候需要给变量初始化? 5.1.4.2初始化变量的两个时机 5.1.4.3通过计算得到初始值 5.1.4.4变量的取值范围 5.2变量与内存地址 5.3常量 5.3.1几种数据类型常数的表达方法 5.3.1.1整型常数的表达 5.3.1.2实型常数的表达 5.3.1.3字符常量的表达 5.3.1.4字符串常量 5.3.2用宏表示常数 5.3.3常量定义 5.3.4枚举常量 5.3.4.1为什么需要枚举类型 5.3.4.2定义枚举类型的基本语法 5.3.4.3关于枚举常量的输出效果 5.1从类型到变量 5.1.1公孙龙的“白马非马” 故事是春秋时的公孙龙先生说的
第五章 变量和常量 5.1 从类型到变量 5.1.1 公孙龙的“白马非马” 5.1.2 定义变量 5.1.3 如何为变量命名 5.1.4 如何初始化变量 5.1.4.1 什么时候需要给变量初始化? 5.1.4.2 初始化变量的两个时机 5.1.4.3 通过计算得到初始值 5.1.4.4 变量的取值范围 5.2 变量与内存地址 5.3 常量 5.3.1 几种数据类型常数的表达方法 5.3.1.1 整型常数的表达 5.3.1.2 实型常数的表达 5.3.1.3 字符常量的表达 5.3.1.4 字符串常量 5.3.2 用宏表示常数 5.3.3 常量定义 5.3.4 枚举常量 5.3.4.1 为什么需要枚举类型 5.3.4.2 定义枚举类型的基本语法 5.3.4.3 关于枚举常量的输出效果 5.1 从类型到变量 5.1.1 公孙龙的“白马非马” 故事是春秋时的公孙龙先生说的
城门上告示:“马匹不得入城”。公孙龙同志骑白马而来,遭拒入。公孙龙一脸正色 告示上写的是‘马’,而我骑的是‘白马’,难道‘马’等于“白马’吗?” 守门士兵觉得白马还真不是马,于是放行。 依公孙龙先生的理论认为:如果白马是马,黑马也是马,那么岂不白马等于黑马,所以, 不能说白马是马。“白马非马”是中国哲学史上的一桩公案。不过,若是我们从程序的角 度上说,可以认为:马在这里表示一种类型,而白马,黑马它们的类型都是马。 白马,黑马具有相同的“数据类型”,但它们都相对独立的个体。从这点说,别说有白 黑之分,就算同样是白马,这一匹和哪一匹白马,也是相对独立的个体 在程序中,“类型”和“变量”的关系正是“马”和“白马”的关系。 如果C或C++有这种数据类型: Horse,那么,定义一匹“白马”的变量应该这样: orse aWhi tehorse 以后我们说不定真的有机会自己定义 Horse,不过现在,我们在上一章的学的数据类型 char,int,bool等等 假设我们需发使用一个有关年龄的变量,在C或C++中是这样定义的 Int age 现在让我们来事先建立一个空的工程,随着本章课程的进展,我们需要不断地在工程中 加入零星的代码,及时实践。 仍然是一个空的控件台程序。方法是…以前我们讲过,忘了就看前面章节吧。 代码文件Unit1.cpp中,手工加入以下的黑体部分: #include #pragma hdrstop / #pragma argsused
城门上告示:“马匹不得入城”。公孙龙同志骑白马而来,遭拒入。公孙龙一脸正色: “告示上写的是‘马’,而我骑的是‘白马’,难道 ‘马’等于 ‘白马’吗?” 守门士兵觉得白马还真不是马,于是放行。 依公孙龙先生的理论认为:如果白马是马,黑马也是马,那么岂不白马等于黑马,所以, 不能说白马是马。“白马非马”是中国哲学史上的一桩公案。不过,若是我们从程序的角 度上说,可以认为:马在这里表示一种类型,而白马,黑马它们的类型都是马。 白马,黑马具有相同的“数据类型”,但它们都相对独立的个体。从这点说,别说有白 黑之分,就算同样是白马,这一匹和哪一匹白马,也是相对独立的个体。 在程序中,“类型”和“变量”的关系正是“马”和“白马”的关系。 如果 C 或 C++有这种数据类型: Horse,那么,定义一匹“白马”的变量应该这样: Horse AWhiteHorse; 以后我们说不定真的有机会自已定义 Horse,不过现在,我们在上一章的学的数据类型 是: char,int,bool 等等。 假设我们需发使用一个有关年龄的变量,在 C 或 C++中是这样定义的: int age; 现在让我们来事先建立一个空的工程,随着本章课程的进展,我们需要不断地在工程中 加入零星的代码,及时实践。 仍然是一个空的控件台程序。方法是……以前我们讲过,忘了就看前面章节吧。 代码文件 Unit1.cpp 中,手工加入以下的黑体部分: //------------------------------------------------------------------------- -- # i nclude #pragma hdrstop //------------------------------------------------------------------------- -- #pragma argsused
int main(int argc, char* argv[) getchar( return 0 5.1.2定义变量 数据类型变量名 张三”既可以指张三这个人,也可以是张三的名字。同样,上面的“变量名”,其实 也就是变量本身 举上一节的例子 Int 其中,int是数据类型(整型),而age是变量名,更多的时候,我们就说是变量age 最后是一人分号。它表示定义一变量在C或C++里一句完整的语句。因为C++的语言总是以 分号结束。 如果要声明一个字符类型变量 char letter 声明一个boo1类型的变量
int main(int argc, char* argv[])] { g etchar(); return 0; } //------------------------------------------------------------------------- -- 5.1.2 定义变量 语法: 数据类型 变量名; “张三”既可以指张三这个人,也可以是张三的名字。同样,上面的“变量名”,其实 也就是变量本身。 举上一节的例子: int age; 其中,int 是数据类型(整型),而 age 是变量名,更多的时候,我们就说是变量 age。 最后是一人分号。它表示定义一变量在 C 或 C++里一句完整的语句。因为 C++的语言总是以 分号结束。 如果要声明一个字符类型变量: char letter; 声明一个 bool 类型的变量:
bool do u love me 其它类型,除了void不能直接定义一个变量以外,格式都是一样的 void avoid;//错!void类型无法直接定义一个变量。 有时同一时候同一数据类型需要多个变量,此时可以分别定义,也可以一起定义 Int a Int Int c 下面采用一起定义,会更省事 int a.b.c 起定义多个同类型变量的方法是:在不同变量之间以逗号()分隔,最后仍以分号 ;)结束。 让我们来试试变量定义,另外,我们还要趁此机会,看看一个变量在仅仅进行定义之后 它的值会是什么 继续上一小节的代码。仍然是加入黑体部分,当然∥/及其后面的内容是注释,你可以 不输入 int main(int argc, char* argv[)] //定义变量 7777 //以下定义三个变量:a,bc int a. double bc
bool do_u_love_me; 其它类型,除了 void 不能直接定义一个变量以外,格式都是一样的。 void avoid; //错!void 类型无法直接定义一个变量。 有时同一时候同一数据类型需要多个变量,此时可以分别定义,也可以一起定义: int a; int b; int c; 下面采用一起定义,会更省事: int a,b,c; 一起定义多个同类型变量的方法是:在不同变量之间以逗号(,)分隔,最后仍以分号 (;)结束。 让我们来试试变量定义,另外,我们还要趁此机会,看看一个变量在仅仅进行定义之后, 它的值会是什么。 继续上一小节的代码。仍然是加入黑体部分,当然 // 及其后面的内容是注释,你可以 不输入。 ...... int main(int argc, char* argv[])] { / / ///////////////定义变量 / / //////////////////////////////////////////////// / /以下定义三个变量:a,b,c i nt a ; d ouble b ,c;
//a,b,c仅仅被定义,它的值会是什么?我们用cout输出三个变量: cout<<"a="<<a<<"b="<<b<<"c="<<c<<end 0 最好先保存代码文件和工程文件。然后按F9运行。以下是笔者机器得到结果 1b=3.82587e-66c=5.43231e-312 a是1,b和c都像天文数字?嗯,从这里我们学到一个C,C+编程极其重要知识:未 初始化的变量,它的值将是未确定的。所谓“未初始化”,就是指这个变量只有定义代码 而没有赋值 立即重复执行这段代码,得到结果可能都一样,但这并不说明这些值就是可以确定不 5.1.3如何为变量命名 C/C++的变量的名字中只能有以下字符:大小写字母、阿拉伯数字(但不能做为开头) 下划线 汉字不能成为变量名。 不过,就算允许,又有谁会这么累呢,用汉字作变量名? 不能或不要 不能取名为C、C++的保留字
/ /a,b,c 仅仅被定义,它的值会是什么?我们用 c out 输出三个变量: c out < < " a = " < < a < < " b = " < < b < < " c = " < < c < < e ndl; getchar(); return 0; } 最好先保存代码文件和工程文件。然后按 F9 运行。以下是笔者机器得到结果。 a 是 1,b 和 c 都像天文数字?嗯,从这里我们学到一个 C,C++编程极其重要知识:未 初始化的变量,它的值将是未确定的。所谓“未初始化”,就是指这个变量只有定义代码, 而没有赋值。 (立即重复执行这段代码,得到结果可能都一样,但这并不说明这些值就是可以确定不 变。) 5.1.3 如何为变量命名 C/C++的变量的名字中只能有以下字符:大小写字母、阿拉伯数字(但不能做为开头)、 下划线 _。 汉字不能成为变量名。 不过,就算允许,又有谁会这么累呢,用汉字作变量名? 不能或不要 不能取名为 C、C++的保留字。 如:
int char;//不行 这是不被允许的。char是一个保留字。我们不能再拿来做变量 不能超过250个字符 这在BCB里有规定。是一个可以调整的值 不能以数字开头 int 100 //不行 int lore //不行 不能夹有空格 bool do you love me;//不行 你可以用下划线代替空格 bool do you love me: //0K 不能在同一作用范围内有同名变量(仅C++) 比如 Int abc int abcd int abc;//不行 在C里,上面重复定义变量abc是被允许的 关于作用范围,我们以后会讲到。 不要和C、C++中已有的全局变量,函数,类型名取相同的名字。 double sin 这不合适。因为C库为我们提供了计算正弦值的函数,名字就叫sin; 不要太长
int char; //不行 这是不被允许的。char 是一个保留字。我们不能再拿来做变量。 不能超过 250 个字符。 这在 BCB 里有规定。是一个可以调整的值。 不能以数字开头 int 100; //不行 int 100ren; //不行 不能夹有空格 bool do you love me; //不行 你可以用下划线代替空格: bool do_you_love_me; //OK 不能在同一作用范围内有同名变量 (仅 C++) 比如: int abc; int abcd; int abc; //不行 在 C 里, 上面重复定义变量 abc 是被允许的。 关于作用范围,我们以后会讲到。 不要和 C、C++中已有的全局变量,函数,类型名取相同的名字。 double sin; 这不合适。因为 C 库为我们提供了计算正弦值的函数,名字就叫 sin; 不要太长
是的,250个字符其实太长了。如果有个变量名长达30个字母,我看不仅你自已写得累 别人看着也会觉得是在读外国小说,主人公的名字太长,烦人 不要太短 这个我们放到后面说 以上几点中,凡标为“不能”,意味如果你违反了,你的程序便会在编译时出错。而“不 要”则仅属建议内容。真要这么做,程序也没错 另外,我们还建议要为每个变量取一个有意义的名字。比如 Numberofstudents,这个变 量一看就明白是为“学生的人数”定义的。而如果定义为aa,cc,之类,就容易混淆。当 然,有一些约定成俗的用法,如字母i,j,等常用来作循环流程中的计数变量。再者,有意 义的名字并不是指一定要把变量所要代表的意思用英文句子写出,一般可以用简写,如 NumOfStudent,它同样意义明了,但更简短。而且,如果我们英文一般,那么有时也可以 使用拼音。这里就不举例了,因为笔者连拼音都很次。 前面说到取名不要太短,说的就是避免像a,cc之类的图输入方便,但毫无意义,不 可读的变量命名习惯 (你很快就会在教程中发现,笔者似乎自已违反了这个规定,用一些a,b,c作为变量名。 这不能说是笔者的错。因为会有些时候变量的意义并不重要 最后,C,C++是区要大小写的语言,所以变量Num和变量num完全是两个变量。大家 在定义,使用变量要注意到这一点。 关于变量的命名,我们不做实践。下面附加说说编程中命名的一些风格 附:关于命名变量的几种风格 较早以前,现在仍流行于UNIX、 Linux编程界,程序员喜欢用全部小写的单词来命名变 量,如果两个单词,比如 Imy car,常用的命名方法有两种: mycar或 my Car。m_car自然 看起清楚,不过输入频繁地下划线是件累事(根据指法,下划线必须使用小指头按)。后」 种方法被称为“驼峰表示法”,原因是大写字母看起来想凸起的驼峰
是的,250 个字符其实太长了。如果有个变量名长达 30 个字母,我看不仅你自已写得累, 别人看着也会觉得是在读外国小说,主人公的名字太长,烦人。 不要太短 这个我们放到后面说。 以上几点中,凡标为“不能”,意味如果你违反了,你的程序便会在编译时出错。而“不 要”则仅属建议内容。真要这么做,程序也没错。 另外,我们还建议要为每个变量取一个有意义的名字。比如 NumberOfStudents,这个变 量一看就明白是为“学生的人数”定义的。而如果定义为 aaa,cc,之类,就容易混淆。当 然,有一些约定成俗的用法,如字母 i,j,等常用来作循环流程中的计数变量。再者,有意 义的名字并不是指一定要把变量所要代表的意思用英文句子写出,一般可以用简写,如 NumOfStudent,它同样意义明了,但更简短。而且,如果我们英文一般,那么有时也可以 使用拼音。这里就不举例了,因为笔者连拼音都很次。 前面说到取名不要太短,说的就是避免像 aaa,cc 之类的图输入方便,但毫无意义,不 可读的变量命名习惯。 (你很快就会在教程中发现,笔者似乎自已违反了这个规定,用一些 a,b,c 作为变量名。 这不能说是笔者的错。因为会有些时候变量的意义并不重要) 最后,C , C ++是区要大小写的语言,所以变量 Num 和变量 num 完全是两个变量。大家 在定义,使用变量要注意到这一点。 关于变量的命名,我们不做实践。下面附加说说编程中命名的一些风格。 附:关于命名变量的几种风格。 较早以前,现在仍流行于 UNIX、Linux 编程界,程序员喜欢用全部小写的单词来命名变 量,如果两个单词,比如 my car,常用的命名方法有两种:my_car 或 myCar。my_car 自然 看起清楚,不过输入频繁地下划线是件累事(根据指法,下划线必须使用小指头按)。后一 种方法被称为“驼峰表示法”,原因是大写字母看起来想凸起的驼峰
之所以不使用 My Car,原因是C/C++允许程序自定义数据类型,所以有必要从一个名字上 很快地区分它是变量或是数据类型。方法是让自定义的数据类型都用大写开头。比如前面 的说的“马”是程序员自定的数据类型,那么如果采用这里的命名规则,则应取名为: Horse, 而“一匹白马”是变量,所以取名为: a Whi tehorse Horse aWhi tehorse 在C++ Builder里,并没有限制大家如何为变量取名。所以为了仍可以很明显的做到上 述的区分,CB的方法是对用户自定义的数据类型在前头加一个字母T(Type的首字母)。 仍如 Horse,则改名为: HOrse前面我们写 Windows版的 hello world时,使用了一个 Label 控件,其实,检查代码你会发现,它的类名就叫: TLabel 最后还有一种方法是匈牙利标记法( Hungarian notation)。该法要求在每人变量的前 面加上若干个用于表示该变量的数据类型的小写字母。如 iMy Car表示这个变量是整型(i表 示int);而倘若是 cMy Car,则表示这个变量是char类型。该法经过一段时间的训练熟悉以 后,会带来一些好处。问题是如果对自定义的数据类型也按这种方法进行,就不是经过训 练就能熟悉了。比如 hoWhi te,这个名字中的ho表示“马”,真有点强人所难。举上实际存 在的例子,在 Windows api中,如果你看到 LPCITEMIDLIST pidlRoot 想要一眼看明白 pidroot,必须的要求是你很明白 ITEMIDLIST是什么玩意儿了 是的, Windows的API使用的是最后一种方法。在大多数情况下,它的变量的名字都看 上去怪怪的 在本部教程中,我们在正式程序中,最常使用的方法是简单的“驼峰”法。 5.1.4如何初始化变量 5.1.4.1什么时候需要给变量初始化? nt a 声明了一个整型变量a。但这变量的值是多少?a等于0吗?还是等于100?我们都不知 道。“不知道”的意思是:a有值,但这个值的大小是随机的,所以我们无法确定 无法确定一个变量值是常有的事,比如我们要求用户输入他的年龄。我们需要声明一个 整型变量来存储用户年龄,但在用户输入之前,我们是无法确认它的值
之所以不使用 MyCar,原因是 C/C++允许程序自定义数据类型,所以有必要从一个名字上 很快地区分它是变量或是数据类型。方法是让自定义的数据类型都用大写开头。比如前面 的说的“马”是程序员自定的数据类型,那么如果采用这里的命名规则,则应取名为:Horse, 而“一匹白马”是变量,所以取名为:aWhiteHorse。 Horse aWhiteHorse; 在 C++ Builder 里,并没有限制大家如何为变量取名。所以为了仍可以很明显的做到上 述的区分,CB 的方法是对用户自定义的数据类型在前头加一个字母 T(Type 的首字母)。 仍如 Horse,则改名为:THorse。前面我们写 Windows 版的 hello world 时,使用了一个 Label 控件,其实,检查代码你会发现,它的类名就叫:TLabel。 最后还有一种方法是匈牙利标记法(Hungarian notation)。该法要求在每人变量的前 面加上若干个用于表示该变量的数据类型的小写字母。如 iMyCar 表示这个变量是整型(i 表 示 int);而倘若是 cMyCar,则表示这个变量是 char 类型。该法经过一段时间的训练熟悉以 后,会带来一些好处。问题是如果对自定义的数据类型也按这种方法进行,就不是经过训 练就能熟悉了。比如 hoWhite,这个名字中的 ho 表示“马”,真有点强人所难。举上实际存 在的例子,在 Windows API 中,如果你看到: LPCITEMIDLIST pidlRoot; 想要一眼看明白 pidRoot,必须的要求是你很明白 ITEMIDLIST 是什么玩意儿了。 是的,Windows 的 API 使用的是最后一种方法。在大多数情况下,它的变量的名字都看 上去怪怪的。 在本部教程中,我们在正式程序中,最常使用的方法是简单的“驼峰”法。 5.1.4 如何初始化变量 5 . 1.4.1 什么时候需要给变量初始化? int a; 声明了一个整型变量 a。但这变量的值是多少?a 等于 0 吗?还是等于 100?我们都不知 道。“不知道”的意思是:a 有值,但这个值的大小是随机的,所以我们无法确定。 无法确定一个变量值是常有的事,比如我们要求用户输入他的年龄。我们需要声明一个 整型变量来存储用户年龄,但在用户输 入之前,我们是无法确认它的值
但有些时候,我们可以事先给一个变量初始时的值。同样是年龄的问题,虽然我们不知 道用户到底几岁,但我们知道他不可能是0,所以我们把年龄一开始设为0。为什么要这 样?用户有时不小心忘了输入年龄(就像我们在网上填表一样),我们就可以检查年龄是 否为0来发现了。另外一种相反的用法是,我们发现大都数用户是8岁(比如一个小学生 入学登记表),这时我们初始化年龄变量为8,目的是为了方便用户了 那么,如果为一个变量赋值呢? 答案就像我们初中的代数:设x=10,y=100。用等号。请记住:现实生活中,等号 (=)有两个意义,但在C/C++里,=只用来给一个变量赋值 5.1.42初始化变量的两个时机 在定义时初始化变量 in t 通过一个等号,我们让a的值等于0 同时定义多个变量时也一样 int a =0, b=1. 当然也可以根据需要,只给部分变量初始化 In int a, b= 1 2.在定义以后赋值 100 5.1.4.3通过计算得到初始值
但有些时候,我们可以事先给一个变量初始时的值。同样是年龄的问题,虽然我们不知 道用户到底几岁,但我们知道他不可能是 0 ,所以我们把年龄一开始设为 0。为什么要这 样?用户有时不小心忘了输入年龄(就像我们在网上填表一样),我们就可以检查年龄是 否为 0 来发现了。另外一种相反的用法是,我们发现大都数用户是 8 岁(比如一个小学生 入学登记表),这时我们初始化年龄变量为 8,目的是为了方便用户了。 那么,如果为一个变量赋值呢? 答案就像我们初中的代数:设 x = 10, y = 100。用等号。请记住:现实生活中,等号 (=)有两个意义,但在 C/C++里,= 只用来给一个变量赋值。 5 . 1.4.2 初始化变量的两个时机 1. 在定义时初始化变量 int a = 0; 通过一个等号,我们让 a 的值等于 0; 同时定义多个变量时也一样: int a = 0, b= 1; 当然也可以根据需要,只给部分变量初始化。 int a = 0, b; 或: int a,b = 1; 2. 在定义以后赋值 int a; a = 100; 5 . 1.4.3 通过计算得到初始值
给变量赋值,除了给一个直接的值以外,还可以通过计算获得。 inta=-3+200-5 或者如: int a= 9 int b= 3 int c=a/b (/表示除号) 现在来试试给变量赋值的几种方法。 int main (int argc, char* argv)] ///m定义变量 777777777 //以下定义三个变量:a,b,c Int a double bc //用cout输出三个变量 cout<<"a="<<a<"b="<<b<<"c="<<c<<endl; m/始化变量// int d =0: float e= 1. 234, f f=567.8+0.2 co吐t<<"d="<<d<<"e="<<e<<"f="<<f<<endl
给变量赋值,除了给一个直接的值以外,还可以通过计算获得。如: int a = -3 + 200 - 5; 或者如: int a = 9; int b = 3; int c = a / b; (/ 表示除号) 现在来试试给变量赋值的几种方法。 ...... int main(int argc, char* argv[])] { /////////////////定义变量 ////////////////////////////////////////////////// //以下定义三个变量:a,b,c int a; double b,c; //用 cout 输出三个变量: cout << "a = " << a << " b = " << b << " c = " << c << endl; / / ///////////////初始化变量//////////////////////////////////////////////// i nt d = 0 ; f loat e = 1 .234, f ; f = 5 6 7.8 + 0 .2; c o ut < < " d = " < < d < < " e = " < < e < < " f = " < < f < < e ndl;