(原创)谭浩强C++程序设计学习笔记:第二章 数据类型与表达式

(原创)谭浩强C++程序设计学习笔记:第二章 数据类型与表达式

数据结构 指的是数据的组织形式。例如,数组就是一种数据结构。

C++ 可以使用的数据类型如下:

(原创)谭浩强C++程序设计学习笔记:第二章 数据类型与表达式

布尔型就是逻辑型,空类型就是无值型。

C++ 的数据包括常量与变量,常量与变量都具有类型。

例如:利用指针和结构体类型可以构成表、树、栈等复杂的数据结构。

说明:

        (1) 整型数据分为长整型 (long int) 、 一般整型 (int) 和 短整型 (short int)。 在 int 前面加 long 和 short 分别表示长整型和短整型。

        (2) 整型数据的存储方式为按二进制数形式存储,例如十进制整数 85 的二进制形式为 1010101 ,则在内存中的存储形式如图 2.1 所示。

(原创)谭浩强C++程序设计学习笔记:第二章 数据类型与表达式

        (3) 在整型符号 int 和字符型符号 char 的前面, 可以加修饰符 signed(表示 “有符号” ) 或 unsigned( 表示 “无符号” )。如果指定为 signed, 则数值以补码形式存放,存储单元中的 最高位(bit) 用来表示数值的符号。如果指定为 unsigned, 则数值没有符号,全部二进制位都用来表示数值本身。例如短整型数据占两个字节,见图 2.2:

(原创)谭浩强C++程序设计学习笔记:第二章 数据类型与表达式

 有符号时,能存储的最大值为 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所示:

(原创)谭浩强C++程序设计学习笔记:第二章 数据类型与表达式

 < >

字符常量

        用单撇号括起来的一个字符就是字符型常量。′。

        

        开头的字符序列,转义字符;

        将一个字符常量存放到内存单元时,代码放到存储单元中。

(原创)谭浩强C++程序设计学习笔记:第二章 数据类型与表达式

         码进行算术运算。

// 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。

(原创)谭浩强C++程序设计学习笔记:第二章 数据类型与表达式

 串结束标志。

        字节。

        

        且在两行字符串间无空格。如

(原创)谭浩强C++程序设计学习笔记:第二章 数据类型与表达式

符号常量

         识符形式出现的常量。

// 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

(原创)谭浩强C++程序设计学习笔记:第二章 数据类型与表达式

       

        )。

        第一个字符必须为字母或下划线。

        的关键字、系统函数名和类名相同。

        个字符,超过的字符不被识别。

        先定义,后使用 ”。

        要求对变量作强制定义的目的是:

                错误,避免变量名使用时出错。

                数方式存储数据。

                (3) 指定每一变量属于一个特定的类型,这就便于在编译时,据此检查该变量所进行的运算是否合法。例如,整型变量 a 和 b , 可以进行求余运算:a%b ,% 是 “求余”,得到 a/b 的余数。如果将 a 和 b 指定为实型变量,则不允许进行 “求余”运算,在编译时会给出有关的出错信息。

        初始化。

        预测的值,即该存储单元中当时的内容是不知道的。

        初始化 初值的,相当于执行一个赋值语句。

常变量

        。 例如,

                变,指定其值始终为 3

        ,此后它的值不能再改变。

        

        义的常变量:

                * 量命名的存储单元。

                * 运算符测出其长度。

        

C++运算符

        提供了以下运算符:

                算术运算符

减) 

                关系运算符

                 不等于)

                 逻辑运算符、

逻辑非) 

位运算符

                 按位取反)

=及其扩展赋值运算符)

条件运算符 (?:)

                ,)

                 )

                & )

                求字节数运算符(sizeof)

                

                

                 

                 ])

                 (如函数调用运算符())

       

        

        5 )

        

        型数据,如7%4的值为3)。

        向零取整” ” ”

的方法,即 5/3 的值等于 1, -5/3 的值等于 -1,取整后向零靠拢。

         型数据处理。

算术表达式

         表达式。

        (例如赋值运算符)。

        所示。

(原创)谭浩强C++程序设计学习笔记:第二章 数据类型与表达式

自增和自减运算符

         

         的值为 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;

型变量

           的情况来说明。

(原创)谭浩强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

(原创)谭浩强C++程序设计学习笔记:第二章 数据类型与表达式

不同类型的整型数据间的赋值归根结底就是一条:按存储单元中的存储形式直接传送。

复合赋值操作符

          (原创)谭浩强C++程序设计学习笔记:第二章 数据类型与表达式

赋值表达式

          赋值表达式 ”。

         有一个值。

         

(原创)谭浩强C++程序设计学习笔记:第二章 数据类型与表达式

逗号运算符

          (原创)谭浩强C++程序设计学习笔记:第二章 数据类型与表达式

 (原创)谭浩强C++程序设计学习笔记:第二章 数据类型与表达式