一段程序的核心有两个方面:一个是要处理的信息,另一个就是处理的计算流程。计算机所处理的信息一般叫做“数据”(data)。
对计算机来说,需要明确地知道把数据存放在哪里、以及需要多大的存储空间。在机器语言和汇编语言中,我们可能需要充分了解计算机底层的存储空间,这非常麻烦;而在C++程序中,我们可以通过“声明变量”的方式来实现这些。
变量和常量
为了区分不同的数据,在程序中一般会给它们起个唯一的名字,这就是所谓的“变量”。在C++中,“变量”其实就是记录了计算机内存中的一个位置标签,可以表示存放的数据对象。
1.变量的声明和赋值
想要使用变量,必须先做“声明”,也就是告诉计算机要用到的数据叫什么名字,同时还要指明保存数据所需要的空间大小。比如:
inta;
这里包含两个信息:一个是变量的名字,叫做“a”,它对应着计算机内存中的一个位置;另一个是变量占据的空间大小,这是通过前面的“int”来指明的,表示我们需要足够的空间来存放一个“整数类型”(integer)数据。
所以变量声明的标准语法可以写成:
数据类型变量名;
变量名也可以有多个,用逗号分隔就可以。
在C++中,可以处理各种不同类型的数据,这里的int就是最基本的一种“数据类型”(datatype),表示一般的整数。
当然,如果我们直接在代码中声明一个变量,然后打印输出的话就会报错,因为这个变量没有被“初始化”。也就是说,a这个变量现在可以表示内存中一个位置了,但是里面的数据是什么?这就需要让a有一个“初始值”:
inta=1;
这个操作叫做“赋值”。需要说明的是,这里等号“=”表示的是赋值操作,并不是数学上的“等于”。换句话说,我们还可以继续给a赋别的值:
inta=1;
a=2;
现在a的值就是2了。a的值可以改变,所以它叫做“变量”。
扩展知识:
C++是一种静态类型(staticallytyped)语言,需要在编译阶段做类型检查(typechecking)。也就是说所有变量在创建的时候必须指明类型,而且之后不能更改。对于复杂的大型程序来说,这种方式更有助于提前发现问题、提高运行效率。
代码如下:
#includeiostream
usingnamespacestd;
intmain()
{
inta=1;
cout"a="aendl;
a=2;
cout"现在a="aendl;
cin.get();
}
要运行的话,可以右键项目名-设为启动项目,或者右键解决方案-设置启动项目。
注意,如果不给初始值,后面再赋值、再使用也是合法的;但一般不能不赋值、直接使用。因为在函数中定义的变量不被初始化,而在函数外部定义的变量会被默认初始化为0值。
2.标识符
每个变量都有一个名字,就是所谓的“变量名”。在C++中,变量、函数、类都可以有自己专门的名字,这些名字被叫做“标识符”。
标识符由字母、数字和下划线组成;不能以数字开头;标识符是大小写敏感的,长度不限。
所以下面的变量名都是合法而且不同的:
intb,B,B2,a1_B2;
此外,C++中还对变量命名有一些要求和约定俗成的规范:
l不能使用C++关键字;
l不能用连续两个下划线开头,也不能以下划线加大写字母开头,这些被C++保留给标准库使用;
l函数体外的标识符,不能以下划线开头;
l要尽量有实际意义(不要定义a、b,而要定义name、age);
l变量名一般使用小写字母;
l自定义类名一般以大写字母开头;
l如果包含多个单词,一般用下划线分隔,或者将后面的单词首字母大写;
所谓的“关键字”,就是C++保留的一些单词,供语言本身的语法使用。包括:
以及C++中使用的一些运算操作符的替代名:
3.作用域
变量有了名字,那只要用这个名字就可以指代对应的数据。但是如果出现“重名”怎么办呢?
在C++中,有“作用域”(scope)的概念,就是指程序中的某一段、某一部分。一般作用域都是以花括号{}作为分隔的,就像之前我们看到的函数体那样。
同一个名字在不同的作用域中,可以指代不同的实体(变量、函数、类等等)。
定义在所有花括号外的名字具有“全局作用域”(globalscope),而在某个花括号内定义的名字具有“块作用域”。一般把具有全局作用域的变量叫做“全局变量”,具有块作用域的变量叫做“局部变量”。
测试代码如下:
#includeiostream
usingnamespacestd;
//全局作用域,全局变量
intnumber=0;
intmain()
{
//块作用域,局部变量
intnumber=1;
//访问局部变量
cout"number="numberendl;
//访问全局变量
cout"number="::numberendl;
cin.get();
}
如果在嵌套作用域里出现重名,一般范围更小的局部变量会覆盖全局变量。如果要特意访问全局变量,需要加上双冒号::,指明是默认命名空间。
4.常量
用变量可以灵活地保存数据、访问数据。不过有的时候,我们希望保存的数据不能更改,这种特殊的变量就被叫做“常量”。在C++中,有两种方式可以定义常量:
(1)使用符号常量
这种方式是在文件头用#define来定义常量,也叫作“宏定义”。
#defineZERO0
跟#include一样,井号“#”开头的语句都是“预处理语句”,在编译之前,预处理器会查找程序中所有的“ZERO”,并把它替换成0。这种宏定义的方式是保留的C语言特性,在C++中一般不推荐。
(2)使用const限定符
这种方式跟定义一个变量是一样的,只需要在变量的数据类型前再加上一个const关键字,这被称为“限定符”。
//定义常量
constintZero=0;
//不能修改常量值
//Zero=10;
const修饰的对象一旦创建就不能改变,所以必须初始化。
跟使用#define定义宏常量相比,const定义的常量有详细的数据类型,而且会在编译阶段进行安全检查,在运行时才完成替换,所以会更加安全和方便。