📄 第5章 变量和常量.htm
字号:
<P>C/C++的变量的名字中只能有以下字符:大小写字母、阿拉伯数字(但不能做为开头)、下划线 _。</P>
<P>汉字不能成为变量名。</P>
<P>不过,就算允许,又有谁会这么累呢,用汉字作变量名?</P>
<P> </P>
<P><B>不能或不要</B></P>
<P><B>不能</B>取名为C、C++的保留字。</P>
<P>如:</P>
<P>int char; //不行</P>
<P>这是不被允许的。char 是一个保留字。我们不能再拿来做变量。</P>
<P> </P>
<P><B>不能</B>超过250个字符。</P>
<P>这在BCB里有规定。是一个可以调整的值。</P>
<P> </P>
<P><B>不能</B>以数字开头</P>
<P>int 100; //不行</P>
<P>int 100ren; //不行</P>
<P> </P>
<P><B>不能</B>夹有空格</P>
<P>bool do you love me; //不行</P>
<P>你可以用下划线代替空格:</P>
<P>bool do_you_love_me; //OK</P>
<P> </P>
<P><B>不能</B>在同一作用范围内有同名变量 (仅C++)</P>
<P>比如:</P>
<P>int abc; </P>
<P>int abcd; </P>
<P>int abc; //不行</P>
<P> </P>
<P>在C里, 上面重复定义变量 abc是被允许的。</P>
<P>关于作用范围,我们以后会讲到。</P>
<P> </P>
<P><B>不要</B>和C、C++中已有的全局变量,函数,类型名取相同的名字。</P>
<P>double sin; </P>
<P>这不合适。因为C库为我们提供了计算正弦值的函数,名字就叫 sin;</P>
<P> </P>
<P><B>不要</B>太长。</P>
<P>是的,250个字符其实太长了。如果有个变量名长达30个字母,我看不仅你自已写得累,别人看着也会觉得是在读外国小说,主人公的名字太长,烦人。</P>
<P> </P>
<P><B>不要</B>太短</P>
<P>这个我们放到后面说。</P>
<P> </P>
<P>以上几点中,凡标为“<B>不能</B>”,意味如果你违反了,你的程序便会在编译时出错。而“<B>不要</B>”则仅属建议内容。真要这么做,程序也没错。</P>
<P>另外,我们还建议要为每个变量取一个有意义的名字。比如
NumberOfStudents,这个变量一看就明白是为“学生的人数”定义的。而如果定义为
aaa,cc,之类,就容易混淆。当然,有一些约定成俗的用法,如字母i,j,等常用来作循环流程中的计数变量。再者,有意义的名字并不是指一定要把变量所要代表的意思用英文句子写出,一般可以用简写,如
NumOfStudent,它同样意义明了,但更简短。而且,如果我们英文一般,那么有时也可以使用拼音。这里就不举例了,因为笔者连拼音都很次。</P>
<P>前面说到取名不要太短,说的就是避免像 aaa,cc之类的图输入方便,但毫无意义,不可读的变量命名习惯。</P>
<P>(你很快就会在教程中发现,笔者似乎自已违反了这个规定,用一些a,b,c作为变量名。这不能说是笔者的错。因为会有些时候变量的意义并不重要)</P>
<P>最后,<B>C,C++是区要大小写的语言</B>,所以变量 Num 和变量 num
完全是两个变量。大家在定义,使用变量要注意到这一点。</P>
<P> </P>
<P>关于变量的命名,我们不做实践。下面附加说说编程中命名的一些风格。</P>
<P> </P>
<P>附:关于命名变量的几种风格。</P>
<P>较早以前,现在仍流行于UNIX、Linux编程界,程序员喜欢用全部小写的单词来命名变量,如果两个单词,比如my
car,常用的命名方法有两种:my_car或myCar。my_car自然看起清楚,不过输入频繁地下划线是件累事(根据指法,下划线必须使用小指头按)。后一种方法被称为“驼峰表示法”,原因是大写字母看起来想凸起的驼峰。</P>
<P>之所以不使用MyCar,原因是C/C++允许程序自定义数据类型,所以有必要从一个名字上很快地区分它是变量或是数据类型。方法是让自定义的数据类型都用大写开头。比如前面的说的“马”是程序员自定的数据类型,那么如果采用这里的命名规则,则应取名为:Horse,而“一匹白马”是变量,所以取名为:aWhiteHorse。</P>
<P>Horse aWhiteHorse;</P>
<P><B>在C++
Builder里,并没有限制大家如何为变量取名。所以为了仍可以很明显的做到上述的区分,CB的方法是对用户自定义的数据类型在前头加一个字母T(Type的首字母)。</B>仍如
Horse,则改名为:THorse。前面我们写Windows版的hello
world时,使用了一个Label控件,其实,检查代码你会发现,它的类名就叫:TLabel。</P>
<P>最后还有一种方法是匈牙利标记法(Hungarian
notation)。该法要求在每人变量的前面加上若干个用于表示该变量的数据类型的小写字母。如iMyCar表示这个变量是整型(i表示int);而倘若是cMyCar,则表示这个变量是char类型。该法经过一段时间的训练熟悉以后,会带来一些好处。问题是如果对自定义的数据类型也按这种方法进行,就不是经过训练就能熟悉了。比如hoWhite,这个名字中的ho表示“马”,真有点强人所难。举上实际存在的例子,在Windows
API中,如果你看到:</P>
<P>LPCITEMIDLIST pidlRoot;</P>
<P>想要一眼看明白 pidRoot,必须的要求是你很明白 ITEMIDLIST 是什么玩意儿了。</P>
<P>是的,Windows的API使用的是最后一种方法。在大多数情况下,它的变量的名字都看上去怪怪的。</P>
<P>在本部教程中,我们在正式程序中,最常使用的方法是简单的“驼峰”法。</P>
<H4><A name=5.1.4>5.1.4</A> 如何初始化变量</H4>
<H5><A name=5.1.4.1>5.1.4.1</A> 什么时候需要给变量初始化?</H5>
<P>int a;</P>
<P>声明了一个整型变量a。但这变量的值是多少?a等于0吗?还是等于100?我们都不知道。“不知道”的意思是:a
有值,但这个值的大小是随机的,所以我们无法确定。</P>
<P>无法确定一个变量值是常有的事,比如我们要求用户输入他的年龄。我们需要声明一个整型变量来存储用户年龄,但在用户输
入之前,我们是无法确认它的值。</P>
<P>但有些时候,我们可以事先给一个变量初始时的值。同样是年龄的问题,虽然我们不知道用户到底几岁,但我们知道他不可能是 0
,所以我们把年龄一开始设为0。为什么要这样?用户有时不小心忘了输入年龄(就像我们在网上填表一样),我们就可以检查年龄是否为0来发现了。另外一种相反的用法是,我们发现大都数用户是8岁(比如一个小学生入学登记表),这时我们初始化年龄变量为8,目的是为了方便用户了。</P>
<P>那么,如果为一个变量赋值呢?</P>
<P>答案就像我们初中的代数:设 x = 10, y = 100。用等号。请记住:现实生活中,等号(=)有两个意义,但在C/C++里,=
只用来给一个变量赋值。</P>
<H5><A name=5.1.4.2>5.1.4.2</A> 初始化变量的两个时机</H5>
<OL>
<LI>
<H5>在定义时初始化变量</H5></LI></OL>
<P style="MARGIN-LEFT: 40px">int a = 0;</P>
<P style="MARGIN-LEFT: 40px"> </P>
<P style="MARGIN-LEFT: 40px">通过一个等号,我们让a的值等于0;</P>
<P style="MARGIN-LEFT: 40px"> </P>
<P style="MARGIN-LEFT: 40px">同时定义多个变量时也一样:</P>
<P style="MARGIN-LEFT: 40px">int a = 0, b= 1;</P>
<P style="MARGIN-LEFT: 40px"> </P>
<P style="MARGIN-LEFT: 40px">当然也可以根据需要,只给部分变量初始化。</P>
<P style="MARGIN-LEFT: 40px">int a = 0, b;</P>
<P style="MARGIN-LEFT: 40px">或:</P>
<P style="MARGIN-LEFT: 40px">int a,b = 1;</P>
<OL start=2>
<LI>
<H5>在定义以后赋值</H5></LI></OL>
<P style="MARGIN-LEFT: 40px">int a;</P>
<P style="MARGIN-LEFT: 40px">a = 100;</P>
<P> </P>
<H5><A name=5.1.4.3>5.1.4.3</A> 通过计算得到初始值</H5>
<P>给变量赋值,除了给一个直接的值以外,还可以通过计算获得。如:</P>
<P>int a = -3 + 200 - 5;</P>
<P>或者如:</P>
<P>int a = 9;</P>
<P>int b = 3;</P>
<P>int c = a / b;</P>
<P>(/ 表示除号)</P>
<P> </P>
<P>现在来试试给变量赋值的几种方法。</P>
<P> </P>
<P>......</P>
<P>int main(int argc, char* argv[])]</P>
<P>{</P>
<P> /////////////////定义变量//////////////////////////////////////////////////</P>
<P> //以下定义三个变量:a,b,c</P>
<P> int a; </P>
<P> double b,c; </P>
<P> </P>
<P> //用 cout 输出三个变量:</P>
<P> cout << "a = " << a << " b = " << b
<< " c = " << c << endl;</P>
<P> </P>
<P><B>/////////////////初始化变量////////////////////////////////////////////////</B></P>
<P><B> int d = 0;</B></P>
<P><B> float e = 1.234, f;</B></P>
<P><B> f = 567.8 + 0.2;</B></P>
<P> </P>
<P><B> cout << "d = " << d << " e = " << e
<< " f = " << f << endl;</B></P>
<P> </P>
<P> getchar();</P>
<P> return 0;</P>
<P>}</P>
<P> </P>
<H5><A name=5.1.4.4>5.1.4.4</A> 变量的取值范围</H5>
<P><B>1). 变量允许取值范围 = 变量数据类型的范围</B></P>
<P> </P>
<P>关于赋值的最后一个需要注意的是:变量的取值范围。</P>
<P>变量的取值范围?变量是有类型的,变量的允许的取值范围等同于其数据类型的范围。比如一个整型数,那么它的取值范围就是:-2147483648 ~
2147483647。而如果是一个字符类型,它的取值就不能是 -129。</P>
<P>以下是示例:</P>
<P>int a = 3000000000; //错误!</P>
<P>char b = -129; //错误!</P>
<P> </P>
<P>我们来写代码实践一下。由于char类型计算机在输出将直接输出字符,我们不好观察结果,所以我们选择了int类型。</P>
<P>......</P>
<P>int main(int argc, char* argv[])]</P>
<P>{</P>
<P>
/////////////////定义变量//////////////////////////////////////////////////</P>
<P> //以下定义三个变量:a,b,c</P>
<P> int a; </P>
<P> double b,c; </P>
<P> </P>
<P> //用 cout 输出三个变量:</P>
<P> cout << "a = " << a << " b = " << b
<< " c = " << c << endl;</P>
<P> </P>
<P> /////////////////初始化变量////////////////////////////////////////////////<BR>
int d = 0;</P>
<P> float e = 1.234, f;</P>
<P> f = 567.8<B> </B>+ 0.2;</P>
<P> </P>
<P> cout << "d = " << d << " e = " << e
<< " f = " << f << endl;</P>
<P><BR><B>
/////////////////变量值越界//////////////////////////////////////////////////</B></P>
<P><B> int g = 3000000000;
//给g赋值超过int允许的范围,所以g的值不可能如愿等于3000000000</B></P>
<P><B> cout << "g = " << g <<endl;<BR></B></P>
<P> getchar();</P>
<P> return 0;</P>
<P>}</P>
<P> </P>
<P>g 的值已经溢出,它的值究竟是多少?自已按F9运行,看结果吧。</P>
<P> </P>
<P><B>2). bool 类型的特殊</B></P>
<P> </P>
<P>至于 bool
类型,事实上它的内存空间范围和char一样是一字节的(因为计算机能直接处理的最小内存单位是字节),所以按说它也能存256个不同的值,但作为C++的一个规定,强制给它两个值:
false,true。那么 false 是什么呢?其实它是0。而
true则是非0的数。也就是说,值0对应为false,而所有非0的数对应成true。</P>
<P>所以,你这样给bool类型的变量赋值自然没错:</P>
<P>bool do_u_love_me = false; //噢,你不爱我。</P>
<P>或</P>
<P>bool do_u_love_me = true;</P>
<P>但你也可以这样给来:</P>
<P>bool do_u_love_me = 0;</P>
<P>或</P>
<P>bool do_u_love_me = 1;</P>
<P>当然,我们建议使用第一种方法,那是“正规”的方法。</P>
<P>在C里,并没有bool这个数据类型,所以C程序员采用的方法是自定义:</P>
<P>typedef char BOOL;</P>
<P>如果你在某些书上碰到BOOL,你就可以明白它就是我们学的 bool.</P>
<P> </P>
<P>false和true到底是什么?“假”或“真”,很简单啊。噢,我不是问二者的意思,C++之所以要加入bool类型,目的也是为了让程序员在处理那些只用于表示“真或假”、“是或否”等数据时,可以用直观的false和true来表示。而在计算机内部,二者仍然是数。让我们写几行代码,揭开bool类型的“假面”。</P>
<P>......</P>
<P>int main(int argc, char* argv[])]</P>
<P>{</P>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -