前一节中的”Hello World”程序在有效性上是值得商榷的,我们不得不写下几行代码,然后编译的运行,结果只是在屏幕上显示一个简单的句子。也许我们直接从键盘上输出这个句子会更快些。然而程序的工作不会仅仅局限于在屏幕上简单的输出一些文字,因此为了让程序更好的把我们从复杂的工作中解救出来,我们有必要介绍一下变量的概念。
假设我让在你记住一个数字5的同时记住数字2,你只是在大脑中记住了两个不同的数字,现在如果我要你在第一个数字上加1,那么你大脑中保存的数字应该是6(5+1)
和2,我们以减法为例这两个数的结果会是4.
刚才你大脑思考的过程和计算机对变量的做法是类似的。C++中同样的过程可以用下面的指令集来表示:
a = 5; b = 2; a = a + 1; result = a - b; |
很明显,由于我们只用小的整数值面使这个例子非常简单,但是应该能够想到计算机可以存储数心百万计的数字并可以进行复杂的运算。
因此,我们可以定义一个变量做为一块内存的代号来存储一个固定的数值。
每一个变量都需要一个标识符来与其它变量相区分,例如在上面的那部分代码中变量的标志符是a, b, 和result,我们可以给变量起想要的任何名字,只要它们是合法的。
标志符
一个合法的标识符是由数字、字母和下划线组成的字符序列。空格、标点符号和货币符号不应该出现在标识符中,只有数字、字母和下划线是合法字符。变量标识符必须以字母开头,当然你也可以用下划线(_)开头,但是在某些情况下,这些标识符可能做为编译器的保存字或者全局变量来使用,在标识符的任何位置都可以有多条下划线。任何标识符都不能以数字开头。
另一条规则是你必须确保你的标识符不能和C++的关键字相同,也不能和你用的编译器的保留字相同,标准的C++保留字如下:
asm, auto, bool, break, case, catch, char, class, const, const_cast, continue, default, delete, do, double, dynamic_cast, else, enum, explicit, export, extern, false, 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, true, try, typedef, typeid, typename, union, unsigned, using, virtual, void, volatile, wchar_t, while
另外,一些操作符的另外表示法也不要做为你的标识符,因为他们可能性做为某些环境的保留字:
and, and_eq, bitand, bitor, compl, not, not_eq, or, or_eq, xor, xor_eq
你用的编译器还可能要其它的保留字,这需要自己注意.
注意:
C++是一种大小写敏感的语言,这意味着用大写字母写的标识和同名但是用小字字母写的标识符是不同的。例如RESULT、result和Resul这三个变量是完全不同的三个变量。
基本数据类型:
当我们编写程序时我们要把变量存储在计算机中,但是计算机必须要知道我们在存储什么样的数据类型,因为存储一个简单数字和存储一个字符或者是一个大的数字占用的内存数量并不相同,他们被解释的方法并不相同。
计算机的内存是以字节为单位来组织的。字节是我们在C++中可以操控的最小单位,一个字节可以存储一个很小的数据:一个字符或者一个整数(范围是0~255),另外,计算机也可以通过组合字节来操作一些复合类型,比如长整型或者一些其它数字。
现在你可以看一下C++支持的基本数据类型的摘要,包含了他们所表示的数据的范围。
变量名 | 描述 | 字节数 | 表示范围 |
char | 字符或小整数 | 1 | signed: -128 to 127 |
short int (short) | 短整型. | 2 | signed: -32768 to 32767 |
int | 整型. | 4 | signed: -2147483648 to 2147483647 |
long int (long) | 长整型 | 4 | signed: -2147483648 to 2147483647 |
bool | 布尔值.(true 和 false). | 1 | true or false |
float | 单精度浮点数 | 4 | 3.4e +/- 38 (7 digits) |
double | .双精度浮点数 | 8 | 1.7e +/- 308 (15 digits) |
long double | 长双精度浮点数 | 8 | 1.7e +/- 308 (15 digits) |
wchar_t | 宽字符. | 2 | 1 wide character |
字节数和范围两列中的数值是与编译的目标系统相关的,上面所示之值是基于大多数的32系统而言的。
但是对别的系统来说,最普通的规范是int和系统的结构所支持的固有相同字节(这通常被称为word)。对于四种整数类型char, short ,int, long来说,每一种类型都应该至少与前一种类型相同,char通常被定义为一个字节。对float, double和double来说也有同样的规则,每种类型至少要与前一类型的范围相同。
变量的声明
为了在C++中使用变量,我们必须声明我们要指定的数据类型,声明一个变量的语法是在指定数据的类型名(char, float……)之后加上变量的标识符,例如:
int a; float mynumber; |
这是两个合法的变量声明,第一行声明了一个int型的变量a,第二行声明了一个float型的变量mynumber,在声明之后变量a和mynumber就可以在声明之后的代码中使用了。
如果你想声明同一种类型的多个变量时,你可以在一条语句中用逗号分开面来声明多个变量,例如:
int a, b, c; |
这声明了三个变量a,b,c,他们的类型都是int,他们的效果和以下声明的方式是一样的:
int a; int b; int c; |
整数类型char, short, int, long都可以根据所需要的范围而将他们声明成signed或者unsigned类型,有符号型整数既可以存储正数也可以存储负数,无符号数只可以存储正数(包括0),这可以通过在类型符的前面加指定符signed或者unsigned 来实现,例如:
unsigned short int NumberOfSisters; signed int MyAccountBalance; |
如果我们不指定unsigned或者signed大多数编译器都会将变量默认为signed,因此上面第二行的声明也可以改为:
int MyAccountBalance;
有没有signed和unsigned标识符都是相同的。
这一规则对char型有所例外,char和unsigned char及signed char都被视为一种基本数据类型,char用来保存字符,而signed char和unsigned char用来保存范围在一个字节之内的整数。
Short和long可以单独用作类型指示符,在这种情况下,short和short int 相同而long和long int 相同。下面两种变量的声明方式是等效的:
short Year; short int Year; |
最后一条规则是signed和unsigned也可以做为单独的指示符来用,他们和signed int 和unsigned int的效果相同,下面的两种声明方式是等效的:
unsigned NextYear; unsigned int NextYear; |
为了观察变量声明是如何在程序中使用的,我们看一下下面的C++代码来表示一下在本节开头所举的例子:
// operating with variables #include <iostream> using namespace std; int main () { // declaring variables: int a, b; int result; // process: a = 5; b = 2; a = a + 1; result = a - b; // print out the result: cout << result; // terminate the program: return 0; | 4
|
不要被这些陌生的变量的声明方式所吓倒,我们将在以下的章节中解释余下的细节。
变量的作用域
我们打算在程序中使用的所有变量都必须在使用前的某个位置有所声明,就像我们在上段代码main函数的开头声明a,b和result一样。
变量的作用域可以是全局的或者是局部的。全局变量声明在所有的函数之外,而局部变量声明在函数或者模块之内
全局变量可以在声明之后的包括函数内部的任何代码中使用。
局部变量的使用范围局限于其声明所在的{}块中。例如,如果变量声明的函数体的开头(像main函数一样),他的作用域是在他的声明点到函数结束。Main函数中声明的局部变量不能被别的函数访问。
变量的初始化
当声明一个局部变量时,他的值是一个默认的不确定值,但是也许你希望的变量声明的同时给他一个确定值,为了达到这个目标,你可以对变量进行初始化。在C++中有两种初始化的方法:
第一种方法是和C语言一样,在等号之后加上你想要的初值:
type identifier = initial_value ;
例如,如果我们想在声明一个变量a的同时并将他初始化为0,我们可以这样写:
int a = 0;
另一种初始化的方法称为构造初始化,是将初值放在()中。
type identifier (initial_value) ;
例如:
int a (0);
这两种初始化的方法在C++的环境中都是合法的
// initialization of variables #include <iostream> using namespace std; int main () { int a=5; // initial value = 5 int b(2); // initial value = 2 int result; // initial value undetermined a = a + 3; result = a - b; cout << result; return 0; } | 6 |
字符串简介
字符串类型是用来存储非数字值的且可以存储多于一个的字符的变量类型。
C++标准库通过标准的string类来支持字符串的操作。字符串并不是基本数据类型,但是在行为上他和基本数据类型的用法基本相似。
和基本数据类型的第一点不同是为了使用字符串类型我们必须在代码中引用头文件<string>和使用std名字空间。
// my first string #include <iostream> #include <string> using namespace std; int main () { string mystring = "This is a string"; cout << mystring; return 0; } | This is a string |
通过上面的这段代码可以看出string类型可以像数字类型变量用合法数字初始化一样样来被被合法的字符串来初始化,下面两种初始化的方式都是允许的:
string mystring = "This is a string"; string mystring ("This is a string"); |
字符串类型可以像其它基本类型一样执行所有的基本操作,像可以在声明的时候不进行初始化和在执行的时候被重新赋值。
// my first string #include <iostream> #include <string> using namespace std;
int main () { string mystring; mystring = "This is the initial string content"; cout << mystring << endl; mystring = "This is a different string content"; cout << mystring << endl; return 0; }
| This is the initial string content This is a different string content |
想要了解字符串类型的其它细节,可以参照string class reference.