一、数据类型:
基本数据类型(Fundamental Data types)
编程时我们将变量存储在计算机的内存中,但是计算机要知道我们要用这些变量存储什么样的值,因为一个简单的数值,一个字符,或一个巨大的数值在内存所占用的空间是不一样的。
计算机的内存是以字节(byte)为单位组织的。一个字节(byte)是我们在C++中能够操作的最小的内存单位。一个字节(byte)可以存储相对较小数据:一个单个的字符或一个小整数(通常为一个0到255之间的整数)。但是计算机可以同时操作处理由多个字节组成复杂数据类型,比如长整数(long integers)和小数(decimals)。以下列表总结了现有的C++基本数据类型,以及每一类型所能存储的数据范围:
数据类型(DATA TYPES)
名称 | 字节数* | 描述 | 范围* |
---|---|---|---|
char | 1 | 字符(character)或整数(integer ), 8位(bits)长 | 有符号(signed): -128 到 127 无符号(unsigned): 0 到 255 |
short int (short) | 2 | 短整数(integer )16位(bits)长 | 有符号(signed): -32768 到 32767 无符号(unsigned): 0 到 65535 |
long int (long) | 4 | 长整数(integer )32位(bits)长 | 有符号(signed):-2147483648 到 2147483647 无符号(unsigned): 0 到 4294967295 |
int | 4 | 整数(integer) | 有符号(signed): -2147483648 到 2147483647 无符号(unsigned): 0 到 4294967295 |
float | 4 | 浮点数(floating point number) | 3.4e + / - 38 (7 个数字(7digits)) |
double | 8 | 双精度浮点数(double precision floating point number) | 1.7e + / - 308 (15 digits) |
long double | 8 | 长双精度浮点数(long double precision floating point number) | 1.7e + / - 308 (15 digits) |
bool | 1 | 布尔Boolean值。它只能是真(true)或假(false)两值之一。 | true 或 false |
wchar_t | 2 | 宽字符(Wide character) 。这是为存储两字节(2 bytes) 长的国际字符而设计的类型。 | 一个宽字符(1 wide characters) |
* 字节数一列和范围一列可能根据程序编译和运行的系统不同而有所不同。这里列出的数值是多数32位系统的常用数据。对于其他系统,通常的说法是整型(int)具有根据系统结构建议的自然长度(即一个字one word的长度),而4中整型数据char, short, int, long的长度必须是递增的,也就是说按顺序每一类型必须大于等于其前面一个类型的长度。同样的规则也适用于浮点数类型float, double和 long double,也是按递增顺序。
除以上列出的基本数据类型外,还有指针(pointer)和void 参数表示类型,我们将在后面看到。
字符串 (strings)
字符串是用来存储一个以上字符的非数字值的变量。
C++提供一个string类来支持字符串的操作,它不是一个基本的数据类型,但是在一般的使用中与基本数据类型非常相似。
#include <string>
除十进制整数另外, C++还允许使用八进制(octal numbers)和十六进制(hexadecimalnumbers)的字常量(literal constants)。如果我们想要表示一个八进制数,我们必须在它前面加上一个0字符(zerocharacter),而表示十六进制数我们需要在它前面加字符0x (zero, x)。
前两个表达式表示单独的字符(character),后面两个表示由若干字符组成的字符串(string)。注意在表示单独字符的时候,我们用单引号(single quotes (')),在表示字符串或多于一个字符的时候我们用双引号(doublequotes ("))。
escape codes:
\n | 换行符newline |
\r | 回车carriage return |
\t | 跳跃符tabulation |
\v | 垂直跳跃vertical tabulation |
\b | backspace |
\f | page feed |
\a | 警告alert (beep) |
\' | 单引号single quotes (') |
\" | 双引号double quotes (") |
\? | 问号question (?) |
\\ | 反斜杠inverted slash (\) |
另外你可以数字ASCII 码表示一个字符,这种表示方式是在反斜杠(\)之后加以8进制数或十六进制数表示的ASCII 码。在第一种(八进制octal)表示中,数字必需紧跟反斜杠(例如 \23或 \40),第二种(十六进制hexacedimal),必须在数字之前写一个x字符(例如 \x20或 \x4A)。
使用预处理器指令#define,你可以将那些你经常使用的常量定义为你自己取的名字而不需要借助于变量。它的格式是:
#define identifier value
唯一你可能不太熟悉的是用百分号(%)表示的取模运算(module)。取模运算是取两个整数相除的余数。例如,如果我们写a = 11 % 3;,变量a的值将会为结果2,因为2是11除以3的余数。
value += increase; 等同于 value = value + increase;
a -= 5; 等同于 a = a - 5;
a /= b; 等同于 a = a / b;
price *= units + 1; 等同于 price = price * (units + 1);
这个运算符的一个特点是它既可以被用作prefix前缀,也可以被用作后缀suffix,也就是说它既可以被写在变量标识的前面(++a),也可以被写在后面(a++)。虽然在简单表达式如a++或++a中,这两种写法代表同样的意思,但当递增increase或递减decrease的运算结果被直接用在其它的运算式中时,它们就代表非常不同的意思了:当递增运算符被用作前缀prefix (++a) 时,变量a的值线增加,然后再计算整个表达式的值,因此增加后的值被用在了表达式的计算中;当它被用作后缀suffix (a++)时,变量a的值在表达式计算后才增加,因此a在增加前所存储的值被用在了表达式的计算中。注意以下两个例子的不同:
例 1 | 例 2 |
---|---|
B=3; 的值为 4 | B=3; 的值为 3, B 的值为 4 |
在第一个例子中,B在它的值被赋给A之前增加1。而在第二个例子中B原来的值3被赋给A然后B的值才加1变为4。
运算符 = (单个等号)不同于运算符 == (双等号)。第一个是赋值运算符(将等号右边的表达式值赋给左边的变量);第二个(==)是一个判断等于的关系运算符,用来判断运算符两边的表达式是否相等。因此在上面例子中最后一个表达式((b=2) == a),我们首先将数值2赋给变量b,然后把它和变量a进行比较。因为变量a中存储的也是数值2,所以整个运算的结果为true。
逻辑运算符Logic operators ( !, &&, || )
运算符 ! 等同于boolean 运算NOT (取非),它只有一个操作数(operand),写在它的右边。它做的唯一工作就是取该操作数的反面值,也就是说如果操作数值为真true,那么运算后值变为假false,如果操作数值为假false,则运算结果为真true。它就好像是说取与操作数相反的值。例如:
!(5 == 5) | 返回false,因为它右边的表达式(5 == 5)为真true. |
!(6 <= 4) | 返回true因为(6 <= 4)为假false. |
!true | 返回假false. |
!false | 返回真true. |
逻辑运算符&&和||是用来计算两个表达式而获得一个结果值。它们分别对应逻辑运算中的与运算AND 和或运算OR。它们的运算结果取决于两个操作数(operand)的关系:
第一个操作数 a | 第二个操作数 b | 结果 a && b | 结果 a || b |
---|---|---|---|
true | true | true | true |
true | false | false | true |
false | true | false | true |
false | false | false | false |