(原创)谭浩强C++程序设计学习笔记:第二章 数据类型与表达式
数据结构 指的是数据的组织形式。例如,数组就是一种数据结构。
C++ 可以使用的数据类型如下:
布尔型就是逻辑型,空类型就是无值型。
C++ 的数据包括常量与变量,常量与变量都具有类型。
例如:利用指针和结构体类型可以构成表、树、栈等复杂的数据结构。
说明:
(1) 整型数据分为长整型 (long int) 、 一般整型 (int) 和 短整型 (short int)。 在 int 前面加 long 和 short 分别表示长整型和短整型。
(2) 整型数据的存储方式为按二进制数形式存储,例如十进制整数 85 的二进制形式为 1010101 ,则在内存中的存储形式如图 2.1 所示。
(3) 在整型符号 int 和字符型符号 char 的前面, 可以加修饰符 signed(表示 “有符号” ) 或 unsigned( 表示 “无符号” )。如果指定为 signed, 则数值以补码形式存放,存储单元中的 最高位(bit) 用来表示数值的符号。如果指定为 unsigned, 则数值没有符号,全部二进制位都用来表示数值本身。例如短整型数据占两个字节,见图 2.2:
有符号时,能存储的最大值为 2^15 -1,即 32767,最小值为 -32768。无符号时,能存储的最大值为2^16 -1,即 65535,最小值为0。有些数据是没有负值的,可以使用 unsigned, 它存储正数的范围比用 signed 时要大一倍。
(4) 浮点型(又称实型)数据分为单精度(float)、 双精度(double) 和 长双精度(long double) 3种,并且 float 和 double 的数值范围不同。对 float 分配 4 个字节,对 double 和 long double 分配 8 d个字节。
(5) 表中类型标识符一栏中,方括号[]包含的部分可以省写,如 short 和 short int 等效, unsigned int 和 unsigned 等效。
常量
常量的值是不能改变的,一般从其字面形式即可判别是否为常量。常量包括两大类,即 数值型常量(即常数) 和 字符型常量。
这种从字面形式即可识别的常量称为 “字面常量” 或 “直接常量”。
数值常量就是通常所说的常数。
为什么将数值常量区分为不同的类别呢?因为在进行赋值或函数的参数虚实结合时要求数据类型匹配。
整数
一个整型常量可以用 3 种不同的方式表示:
* 十进制整数 * 八进制整数 * 十六进制整数
浮点数
一个浮点数可以用两种不同的方式表示:
(1) 十进制小数形式。
(2) 指数形式(即浮点形式)
如 3.14159 可以表示 为 0.314159 × 10^1 , 3.14159 × 10^0 ,31.4159 × 10^-1 , 314.159× 10^-2等形式。在程序中应表示为:0.314159e1, 3.14159e0,31.4159e-1 ,314.159e-2,用字母 e表示其后的数是以 10 为底的幂,如 e12 12.
存储的。如图2.3所示:
< >
字符常量
用单撇号括起来的一个字符就是字符型常量。′。
。
开头的字符序列,转义字符;
将一个字符常量存放到内存单元时,代码放到存储单元中。
码进行算术运算。
// test1 // 将字符赋给整型变量 #include <iostream> using namespace std; int main() { int i, j; i = 'A'; j = 'B'; cout << i << ' ' << j << endl; return 0; } // 输出:65 66
可以看到:在一定条件下,字符型数据和整型数据是可以通用的。但是应注意字符数据只占一个字节,它只能存放 0~255范围内的整数。
// test2 // 字符数据与整数进行算术运算--将小写字母转换为大写字母 #include <iostream> using namespace std; int main() { char c1, c2; c1 = 'a'; c2 = 'b'; c1 = c1 - 32; c2 = c2 - 32; cout << c1 << ' ' << c2 << endl; return 0; } // 输出:A B
从 ASCII 代码表中可以看到每一个小写字母比它相应的大写字母的 ASCII 代码大 32。
字符串常量
,见图 2.5。
串结束标志。
字节。
。
且在两行字符串间无空格。如
符号常量
识符形式出现的常量。
// test3 // 符号常量的使用 #define PRICE 30 // 注意这不是语句,末尾不要加分号 int main() { int num, total; num = 10; total = num * PRICE; cout << "total = " << total << endl; return 0; }
程序中用预处理命令 #define 指定 PRICE 在本程序单位中代表常量 30 ,此后凡在本程序单位中出现的 PRICE 都代表 30 ,可以和常量一样进行运算。
的,也不能被赋值。
使用符号常量的好处是:
含义清楚。
。
变量
运行期间其值可以改变的量称为变量。
和变量值这两个不同的概念,见图 2.6
)。
第一个字符必须为字母或下划线。
的关键字、系统函数名和类名相同。
个字符,超过的字符不被识别。
先定义,后使用 ”。
要求对变量作强制定义的目的是:
错误,避免变量名使用时出错。
数方式存储数据。
(3) 指定每一变量属于一个特定的类型,这就便于在编译时,据此检查该变量所进行的运算是否合法。例如,整型变量 a 和 b , 可以进行求余运算:a%b ,% 是 “求余”,得到 a/b 的余数。如果将 a 和 b 指定为实型变量,则不允许进行 “求余”运算,在编译时会给出有关的出错信息。
初始化。
预测的值,即该存储单元中当时的内容是不知道的。
初始化 初值的,相当于执行一个赋值语句。
常变量
。 例如,
变,指定其值始终为 3
,此后它的值不能再改变。
。
义的常变量:
* 量命名的存储单元。
* 运算符测出其长度。
C++运算符
提供了以下运算符:
算术运算符
减)
关系运算符
不等于)
逻辑运算符、
逻辑非)
位运算符
按位取反)
=及其扩展赋值运算符)
条件运算符 (?:)
,)
)
& )
求字节数运算符(sizeof)
)
)
)
])
(如函数调用运算符())
)
)
5 )
)
型数据,如7%4的值为3)。
向零取整” ” ”
的方法,即 5/3 的值等于 1, -5/3 的值等于 -1,取整后向零靠拢。
型数据处理。
算术表达式
表达式。
(例如赋值运算符)。
所示。
自增和自减运算符
)
的值为 2)
变为 4)
变为 2)
= i+1。
请注意:
量,而不能用于常量或表达式。
。
的副作用。
用于指针变量,使指针指向下一个地址。
强制类型转换
强制类型转换的一般形式为
(类型名)(表达式)
的值转换成整型)
则只将x转换成整型,然后与y相加。
(x+y)。
型的中间变量,但原来变量的类型未发生变化。
// test4 // 强制类型转换 #include <iostream> using namespace std; int main() { float x; int i; x = 3.6; i = (int)x; cout << "x = " << x << ", i = " << i << endl; return 0; } // 输出:x = 3.6, i = 3
由上可知,有两种类型转换,一种是在运算时不必用户指定,系统自动进行的类型转换,如 3+6.5。
第二种是强制类型转换。当自动类型转换不能实现目的时,可以用强制类型转换。此外,在函数调用时,有时为了使实参与形参类型一致,可以用强制类型转换运算符得到一个所需类型的参数。
赋值运算符
数据赋给一个变量。
或字符型时,在赋值时会自动进行类型转换。
量时,舍弃其小数部分。
以指数形式存储到变量中。、
值范围不能溢出。
赋给整型变量。
(发生截断)。例如
i=289;
char c;
型变量
的情况来说明。
搬(连原有的符号位也作为数值一起传送)。
// test5 // 将有符号数据传送给无符号变量 #include <iostream> using namespace std; int main() { unsigned short a; short int b = -1; a = b; count << " a = " << a << endl; return 0; } // 输出:65535
不同类型的整型数据间的赋值归根结底就是一条:按存储单元中的存储形式直接传送。
复合赋值操作符
赋值表达式
赋值表达式 ”。
有一个值。
。
。
逗号运算符