C++程序设计 第二章 数据类型与表达式.

Slides:



Advertisements
Similar presentations
第6章 基本的程序语句 6.1 基本数据类型及取值范围 6.2 标识符、变量和常量 6.3 基本运算符、表达式及运算的优先级
Advertisements

第2章 数据类型与表达式 2.1 C++的数据类型 2.2 常量 2.3 变量 2.4 C++的运算符 2.5 算术运算符与算术表达式
C/C++语言程序设计 第二章 数据类型和表达式 龚尚福,贾澎涛主编 《C/C++语言程序设计》 西安电子科技大学出版社.
没有规矩,不成方圆。.
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
Chapter2 Constants, Variables, and Data Types
第三章 C语言基础 学习目标: 熟练掌握:C语言的基本数据类型、运算符及表达式 掌握:常见的输入、输出函数使用方法;
第3章 最简单的C程序设计 3.1 顺序程序设计举例 3.2 数据的表现形式及其运算 3.3 C语句 3.4 数据的输入输出.
基础篇 基础知识 —C语言程序设计 学习目标 掌握C语言中三种常见的基本类型及其使用方法 掌握常见的算术运算符和表达式的使用
第2讲 C++语言基础 2.1 基本语法成分 2.2 基本数据类型 2.3 变量和常量 2.4 运算符和表达式 2.5 综合案例分析.
第2章 数据类型与表达式 2.1 C++的数据类型 2.2 常量 2.3 变量 2.4 C++的运算符 2.5 算术运算符与算术表达式
C语言程序设计 第三章 数据类型、运算符与表达式
第2章 数据类型与数据运算.
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
程序设计基础 第 二 章 谌 卫 军 清华大学软件学院 2008年秋季.
1.2 MATLAB变量表达式与数据格式 MATLAB变量与表达式 MATLAB的数据显示格式
C++语言程序设计 C++语言程序设计 第二章 基本数据类型与表达式 第十一组 C++语言程序设计.
C语言程序设计基础 刘新国.
第二章 Java语言基础.
第2章 数据类型、运算符和表达式.
C++语言程序设计 第二章 C++简单程序设计.
第二章 数据类型、运算符与表达式.
第三章 数据类型、运算符与表达式.
第三章 数据类型、运算符与表达式.
第2章 数据的存储与运算 2.1 数据在计算机中是怎样存储的 2.2 整型数据的运算与分析 2.3 实型数据的运算与分析
第二章 数据类型与运算符 基本数据类型 变量的使用 C语言关键字 数据类型转换规则 算术运算符与赋值运算符 比较运算符与逻辑运算符
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
1.3 C语言的语句和关键字 一、C语言的语句 与其它高级语言一样,C语言也是利用函数体中的可执行 语句,向计算机系统发出操作命令。按照语句功能或构成的不 同,可将C语言的语句分为五类。 goto, return.
C++大学基础教程 第2章 基本数据类型与表达式 北京科技大学 信息基础科学系.
C语言程序设计 主讲教师:陆幼利.
学习目标 1、什么是字符集 2、字符集四个级别 3、如何选择字符集.
第1讲 C语言基础 要求: (1) C程序的组成 (2) C语言的标识符是如何定义的。 (3) C语言有哪些基本数据类型?各种基本数
目录 2.1数据类型 2.2常量 2.3变量 2.4库函数 2.5运算符及表达式 1.
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
程序设计基础A(C语言) 主讲教师: 许 康 教师主页:
C程序设计.
第 二 章 数据类型、运算符与表达式.
第二章 基本数据类型及运算 C数据类型概述 基本数据类型 运算符和表达式 混合运算与类型转换 数据的输入输出 顺序程序设计举例.
<编程达人入门课程> 本节内容 内存的使用 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群: ,
C语言程序设计 第一章 数据类型, 运算符与表达式 第二章 顺序程序设计 第三章 选择结构程序设计 第四章 循环控制 第五章 数组.
数据类型与运算规则.
浙江长征职业技术学院—计算机与信息技术系—相方莉制作
第4章 Excel电子表格制作软件 4.4 函数(一).
C语言程序设计 李祥 QQ:
C++语言程序设计教程 第2章 数据类型与表达式 第2章 数据类型与表达式 制作人:杨进才 沈显君.
C++语言程序设计 C++语言程序设计 第四章 数组及自定义数据类型 C++语言程序设计.
第九节 赋值运算符和赋值表达式.
C语言程序设计 李祥 QQ:
第2章 数据类型、运算符与表达式 2.1 程序设计概述
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
ASP.NET实用教程 清华大学出版社 第4章 C#编程语言 教学目标 教学重点 教学过程 2019年5月5日.
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
学习目标 1、了解基本运算符 2、运算符优先级.
2.6 字符型数据 一、 字符常量 1、字符常量的定义 用一对单引号括起来的单个字符,称为字符常量。 例如,‘A’、‘1’、‘+’等。
C程序设计 实验二 数据类型、运算符和表达式 第6讲
本节内容 C语言的汇编表示 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第二章 Java基本语法 讲师:复凡.
程序设计基础A(C语言) 第一章 C语言概述 主讲教师: 许 康
Chap 6 数据类型和表达式 6.1 数据的存储和基本数据类型 6.2 常量和变量 6.3 数据的输入和输出 6.4 类型转换
第3章 数据类型、运算符与表达式 3.1 程序设计概述
复习 标签(label)、文本框(text)控件 按钮:点击事件
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
基本知识 数据类型、变量、常量、运算符.
数据表示 第 2 讲.
第二章 数据类型与表达式 丘志杰 电子科技大学 计算机学院 软件学院.
<编程达人入门课程> 本节内容 有符号数与无符号数 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
第9章 位 运 算.
C语言程序设计 第2章 数据类型.
第二章 简单数据类型 §2.1 数据类型概述 §2.2 变量和常量 §2.3 简单数据类型 §2.4 简单数据类型的相互转换
Presentation transcript:

C++程序设计 第二章 数据类型与表达式

本章主要内容 2.1 C++的数据类型 2.2 常量 2.3 变量 2.4 C++的运算符 2.5 算术运算符与算术表达式 2.2 常量 2.3 变量 2.4 C++的运算符 2.5 算术运算符与算术表达式 2.6 赋值运算符与赋值表达式 2.7 逗号运算符与逗号表达式

2.1 C++的数据类型 计算机处理的对象是数据,而数据是以某种特定的形式存在的(例如整数、浮点数、字符等形式)。不同的数据之间往往还存在某些联系(例如由若干个整数组成一个整数数组)。 数据结构指的是数据的组织形式。例如,数组就是一种数据结构。 处理同一类问题,如果数据结构不同,算法也会不同。例如,对10个整数排序和对包含10个元素的整型数组排序的算法是不同的。

数据类型 基本类型 整型 短整型(short int) C++可以使用的数据类型: 数据类型 基本类型 整型 短整型(short int) 整型(int) 长整型(long int) 字符型(char) 浮点型 单精度型(float) 双精度型(double) 长双精度型(long double) 布尔型(bool) 构造类型 枚举类型(enum) 数组类型 结构体类型(struct) 共用体类型(union) 类类型(class) 布尔型就是逻辑型,空类型就是无值型。 指针类型 引用类型 空类型(void)

C++并没有统一规定各类数据的精度、数值范围和在内存中所占的字节数,各C++编译系统根据自己的情况作出安排。书中表2 C++并没有统一规定各类数据的精度、数值范围和在内存中所占的字节数,各C++编译系统根据自己的情况作出安排。书中表2.1列出了Visual C++数值型和字符型数据的情况。

数据类型的说明 C++的数据包括常量与变量,常量与变量都具有类型。由以上这些数据类型还可以构成更复杂的数据结构。例如利用指针和结构体类型可以构成表、树、栈等复杂的数据结构。 说明: (1) 整型数据分为长整型(long int)、一般整型(int)和短整型(short int)。在int前面加long和short分别表示长整型和短整型。 (2) 整型数据的存储方式为按二进制数形式存储,例如十进制整数85的二进制形式为1010101,则在内存中的存储形式如图2.1所示。

数据类型 —整型数据及取值范围 类型 说明符 位数 数值范围 短整 short 16 -32768~32767 数据类型 —整型数据及取值范围 类型 说明符 位数 数值范围 短整 short 16 -32768~32767 基本 int 32 -231~(231-1) 长整 long 32 -231~(231-1) 无符号 unsigned short 16 0~65535 unsigned [int] 32 0~(232-1) unsigned long 32 0~(232-1)

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

数据类型的说明 有符号时,能存储的最大值为215-1,即32767,最小值为-32768。无符号时,能存储的最大值为216-1,即65535,最小值为0。有些数据是没有负值的,可以使用unsigned,它存储正数的范围比用signed时要大一倍。 (4) 浮点型(又称实型)数据分为单精度(float)、双精度(double)和长双精度(long double)3种,在Visual C++ 6.0中,对float提供7位有效数字,对double提供15位有效数字,并且float和double的数值范围不同。对float分配4个字节,对double和long double分配8个字节。

数据类型 —实型数据及取值范围 类型 说明符 位数 数值范围 单精度 float 32 3.4×10-38~ 3.4×1038 数据类型 —实型数据及取值范围 类型 说明符 位数 数值范围 单精度 float 32 3.4×10-38~ 3.4×1038  双精度 double 64 1.7×10-308~ 1.7×10308 长双精度 long double 64 1.7×10-308~ 1.7×10308

数据类型—布尔型数据 布尔型变量的说明: 例:bool flag; 布尔型数据的取值: 只有 false 和 true 两个值

2.2 常量 2.2.1 什么是常量 常量的值是不能改变的,一般从其字面形式即可判别是否为常量。常量包括两大类,即数值型常量(即常数)和字符型常量。如12,0,-3为整型常量,4.6,-1.23为实型常量,包含在两个单撇号之间的字符为字符常量,如′a′,′x′。

2.2.2 数值常量 数值常量就是通常所说的常数。在C++中,数值常量是区分类型的,从字面形式即可识别其类型。 1. 整型常量(整数)的类型 整型数据可分为int,short int,long int以及unsigned int,unsigned short,unsigned long等类别。整型常量也分为以上类别。为什么将数值常量区分为不同的类别呢?因为在进行赋值或函数的参数虚实结合时要求数据类型匹配。

整型常量的表现形式 一个整型常量可以用3种不同的方式表示: (1) 十进制整数。如1357,-432,0等。long int型常量,则在一个整型常量后面加一个字母L(l) 。例如123L,421L,0L等,这往往用于函数调用中。 (2) 八进制整数。在常数的开头加一个数字0,就表示这是以八进制数形式表示的常数。如020表示这是八进制数20,即(20)8,它相当于十进制数16。 (3) 十六进制整数。在常数的开头加一个数字0和一个英文字母X(或x),就表示这是以十六进制数形式表示的常数。如0X20表示这是十六进制数20,即(20)16,它相当于十进制数32。

2. 浮点数的表示方法 一个浮点数可以用两种不同的方式表示: (1) 十进制小数形式。如21.456,-7.98等。它一般由整数部分和小数部分组成,可以省略其中之一(如78.或.06,.0)。C++编译系统把用这种形式表示的浮点数一律按双精度常量处理,在内存中占8个字节。如果在实数的数字之后加字母F或f,表示此数为单精度浮点数,如1234F,-43f,占4个字节。如果加字母L或l,表示此数为长双精度数(long double),在Visual C++ 6.0中占8个字节。

浮点数的表示方法 (2) 指数形式(即浮点形式) 一个浮点数可以写成指数形式,如3.14159可以表示为0.314159×101,3.14159×100,31.4159×10-1, 314.159×10-2等形式。在程序中应表示为: 0.314159e1,3.14159e0,31.4159e-1 ,314.159e-2,用字母e表示其后的数是以10为底的幂,如e12表示1012。 其一般形式为: 数符 数字部分 指数部分 在程序中不论把浮点数写成小数形式还是指数形式,在内存中都是以指数形式(即浮点形式)存储的。实际上在存储单元中是用二进制数来表示小数部分。 对于以指数形式表示的数值常量,作为双精度常量处理。

2.2.3 字符常量 1. 普通的字符常量 用单撇号括起来的一个字符就是字符型常量。如′a′,′#′,′%′,′D′都是合法的字符常量,在内存中占一个字节。注意: ①字符常量只能包括一个字符,如′AB′ 是不合法的。 ②字符常量区分大小写字母,如′A′和′a′是两个不同的字符常量。 ③撇号(′)是定界符,而不属于字符常量的一部分。如cout<<′a′;输出的是一个字母a 。

2. 转义字符常量 除了以上形式的字符常量外,C++还允许用一种特殊形式的字符常量,就是以 “\”开头的字符序列。例如,′\n′代表一个“换行”符。“cout<<′\n′; ” 将输出一个换行,其作用与“cout<<endl; ” 相同。这种“控制字符”,在屏幕上是不能显示的。只能采用特殊形式来表示。 常用的以“\”开头的特殊字符见书中表2.2。

3. 字符数据在内存中的存储形式及其使用方法 将一个字符常量存放到内存单元时,实际上并不是把该字符本身放到内存单元中去,而是将该字符相应的ASCII代码放到存储单元中。如果字符变量c1的值为′a′,c2的值为′b′,则在变量中存放的是′a′的ASCII码97,′b′ 的ASCII码98,如图2.4(a)所示,实际上在内存中是以二进制形式存放的,如图2.4(b)所示。

在C++中字符型数据和整型数据之间就可以通用。一个字符数据可以赋给一个整型变量,反之,一个整型数据也可以赋给一个字符变量。也可以对字符数据进行算术运算,此时相当于对它们的ASCII码进行算术运算。 例2.1 将字符赋给整型变量。 #include <iostream> using namespace std; int main( ) {int i, j; //i和j是整型变量 i=′A′; //将一个字符常量赋给整型变量i j=′B′; //将一个字符常量赋给整型变量j cout<<i<<′ ′<<j<<′\n′; //输出整型变量i和j的值,′\n′ 是换行符 return 0; } //执行时输出 65 66

可以看到:在一定条件下,字符型数据和整型数据是可以通用的。但是应注意字符数据只占一个字节,它只能存放0~255范围内的整数。 例2.2 字符数据与整数进行算术运算。下面程序的作用是将小写字母转换为大写字母。 #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

4. 字符串常量 用双撇号括起来的部分就是字符串常量,如″abc″,″Hello!″,″a+b″,″Liping″都是字符串常量。字符串常量″abc″在内存中占4个字节(而不是3个字节),见图2.5。 编译系统会在字符串最后自动加一个′\0′作为字符串结束标志。但′\0′并不是字符串的一部分,它只作为字符串的结束标志。如 cout<<″abc″<<endl; 输出3个字符abc,而不包括′\0′。

注意: ″a″和′a′代表不同的含义,″a″是字符串常量,′a′ 是字符常量。前者占两个字节,后者占1个字节。 请分析下面的程序片段: char c; //定义一个字符变量 c=′a′; //正确 c=″a″; //错误,c只能容纳一个字符 字符串常量要用字符数组来存放,见第5章。 请思考: 字符串常量″CHINA\n″包含几个字符? 是7个字符,其中“\n”是一个转义字符。但它在内存中占1个字节(包括一个“\0”字符) 。 C H I N A \0 a \0 a

如果希望将“\”字符也作为字符串中的一个字符,则应写 为″abc\\n″,此时输出字符为a,b,c,\,n。(\\->”\”)。 如果有以下输出语句: cout<<″abc\\\n″<<endl; 则会输出: abc\,然后换行。 cout<<″I say \″Thank you!\″\n″; 输出是: I say ″Thank you!″(\”->”) 如果在一个字符串中最后一个字符为“\”,则表示它是续 行符,下一行的字符是该字符串的一部分,且在两行字符串间无空格。 如cout<<″We must study C\ ++ hard!″; 则输出: We must study C++ hard!

2.2.4 符号常量 为了编程和阅读的方便,在C++程序设计中,常用一个符号名代表一个常量,称为符号常量,即以标识符形式出现的常量。 例2.3 符号常量的使用。 #define PRICE 30 //注意这不是语句,末尾不要加分号 int main ( ) { int num,total; num=10; total=num * PRICE; cout<<″total=″<<total<<endl; return 0; }

符号常量 程序中用预处理命令#define指定PRICE在本程序单位中代表常量30,此后凡在本程序单位中出现的PRICE都代表30,可以和常量一样进行运算,程序运行结果为 total=300 使用符号常量的好处是: (1) 含义清楚。 (2) 在需要改变一个常量时能做到“一改全改”。 如 #define PRICE 35

2.3 变量 2.3.1 什么是变量 其实在前面的例子中已经多次用到了变量。在程序运行期间其值可以改变的量称为变量。一个变量应该有一个名字,并在内存中占据一定的存储单元,在该存储单元中存放变量的值。请注意区分变量名和变量值这两个不同的概念,见图2.6。

2.3.2 变量名规则 先介绍标识符的概念。和其他高级语言一样,用来标识变量、符号常量、函数、数组、类型等实体名字的有效字符序列称为标识符(identifier)。简单地说,标识符就是一个名字。变量名是标识符的一种,变量的名字必须遵循标识符的命名规则。 C++规定标识符只能由字母、数字和下划线3种字符组成,且第一个字符必须为字母或下划线。下面列出的是合法的标识符,也是合法的变量名: sum, average, total, day, month, Student_name, tan, BASIC, li_ling

下面是不合法的标识符和变量名: M.D.John, $123, #33, 3G64, Ling li, C++, Zhang-ling, U.S.A. 注意: 在C++中,大写字母和小写字母被认为是两个不同的字符。因此,sum和SUM是两个不同的变量名。一般地,变量名用小写字母表示,与人们日常习惯一致,以增加可读性。 变量名不能与C++的关键字、系统函数名和类名相同。在国外软件开发工作中,常习惯在变量前面加一个字母以表示该变量的类型,如iCount表示这是一个整型变量,cSex表示这是一个字符型变量。 C++没有规定标识符的长度(字符个数),但各个具体的C编译系统都有自己的规定。

2.3.3 定义变量 在C++语言中,要求对所有用到的变量作强制定义,也就是必须“先定义,后使用” 。定义变量的一般形式是 : 变量类型 变量名表列; 变量名表列指的是一个或多个变量名的序列。 如: float a,b,c,d,e; 定义a,b,c,d,e为单精度型变量。 可以在定义变量时指定它的初值。 如 :float a=83.5,b,c=64.5,d=81.2,e; //对变量a,c,d指定了初值,b和d未指定初值。

定义变量 C语言要求变量的定义应该放在所有的执行语句之前,而C++则放松了限制,只要求在第一次使用该变量之前进行定义即可。也就是说,它可以出现在语句的中间,如: int a; //定义变量a(在使用a之前定义) a=3; //执行语句,对a赋值 float b; //定义变量b(在使用b之前定义) b=4.67; //执行语句,对b赋值 char c; //定义变量c(在使用c之前定义) c=′A′; //执行语句 ,对c赋值 C++要求对变量作强制定义的目的是: 凡未被事先定义的,不作为变量名,这就能保证程序中变量名使用得正确。 每一个变量被指定为一确定类型,在编译时就能为其分配相应的存储单元。如指定a和b为int型,一般的编译系统对其各分配4个字节,并按整数方式存储数据。

2.3.4 为变量赋初值 允许在定义变量时对它赋予一个初值,这称为变量初始化。初值可以是常量,也可以是一个有确定值的表达式。如: float a,b=5.78*3.5,c=2*sin(2.0); 表示定义了a,b,c为单精度浮点型变量,对b初始化为5.78*3.5, 对c初始化为2*sin(2.0),在编译连接后,从标准函数库得到正弦函数sin(2.0)的值。变量a未初始化。 初始化不是在编译阶段完成的,而是在程序运行时执行本函数时赋予初值的,相当于执行一个赋值语句。

2.3.5 常变量 在定义变量时,如果加上关键字const,则变量的值在程序运行期间不能改变,这种变量称为常变量(constant variable)。例如: const int a=3; //用const来声明这种变量的值不能改变,指定其值始终为3 在定义常变量时必须同时对它初始化(即指定其值),此后它的值不能再改变。常变量不能出现在赋值号的左边。例如const int a; a=3; //常变量不能被赋值 可以用表达式对常变量初始化,如: const int b=3+6,c=3*cos(1.5); //b的值被指定为9, c的值被指定为3*cos(1.5)

但应注意,由于使用了系统标准数学函数cos,必须将包含该函数有关的信息的头文件“cmath”(或math 但应注意,由于使用了系统标准数学函数cos,必须将包含该函数有关的信息的头文件“cmath”(或math.h)包含到本程序单位中来,可以在本程序单位的开头加上以下#include命令: #include <cmath> 或 #include <math.h> 请区别用#define命令定义的符号常量和用const定义的常变量。符号常量只是用一个符号代替一个字符串,在预编译时把所有符号常量替换为所指定的字符串,它没有类型,在内存中并不存在以符号常量命名的存储单元。 用#define命令定义符号常量是C语言所采用的方法,C++把它保留下来是为了和C兼容。C++的程序员一般喜欢用const定义常变量。虽然二者实现的方法不同,但从使用的角度看,都可以认为用了一个标识符代表了一个常量。

2.4 C++的运算符 C++的运算符十分丰富,使得C++的运算十分灵活方便。例如把赋值号(=)也作为运算符处理,这样,a=b=c=4就是合法的表达式,这是与其他语言不同的。C++提供了以下运算符: (1) 算术运算符 +(加)-(减) *(乘) /(除) %(整除求余) ++(自加) --(自减) (2) 关系运算符 >(大于) <(小于) ==(等于) >=(大于或等于) <=(小于或等于) !=(不等于)

C++的运算符 (3) 逻辑运算符 &&(逻辑与) ||(逻辑或) !(逻辑非) (4) 位运算符 &&(逻辑与) ||(逻辑或) !(逻辑非) (4) 位运算符 <<(按位左移) >>(按位右移) &(按位与) |(按位或) ∧(按位异或) ~(按位取反) (5) 赋值运算符 (=及其扩展赋值运算符) (6) 条件运算符 (?:) (7) 逗号运算符 (,) (8) 指针运算符 (*) (9) 引用运算符和地址运算符 (&) (10) 求字节数运算符(sizeof ) (11) 强制类型转换运算符( (类型) 或类型( ))(int)a或int(a)

C++的运算符 (12) 成员运算符 (.) (13) 指向成员的运算符 (->) (14) 下标运算符 ([ ]) (15) 其他 (如函数调用运算符()) 在本章中主要介绍算术运算符与算术表达式,赋值运算符与赋值表达式,逗号运算符与逗号表达式,其他运算符将在以后各章中陆续介绍。

2.5 算术运算符与算术表达式 2.5.1 基本的算术运算符 +(加法运算符,或正值运算符。如3+5,+3) 2.5 算术运算符与算术表达式 2.5.1 基本的算术运算符 +(加法运算符,或正值运算符。如3+5,+3) -(减法运算符,或负值运算符。如5-2,-3) * (乘法运算符。如3*5) /(除法运算符。如5/3) %(模运算符,或称求余运算符,%两侧均应为整型数据,如7%4的值为3)。

基本的算术运算符 需要说明,两个整数相除的结果为整数,如5/3的结果值为1,舍去小数部分。但是,如果除数或被除数中有一个为负值,则舍入的方向是不固定的。例如,-5/3在有的C++系统上得到结果-1,有的C++系统则给出结果-2。多数编译系统采取“向零取整”的方法,即5/3的值等于1,-5/3的值等于-1,取整后向零靠拢。 如果参加+, -, *, / 运算的两个数中有一个数为float型数据,则运算的结果是double型,因为C++在运算时对所有float型数据都按double型数据处理。

2.5.2 算术表达式和运算符的优先级与结合性 用算术运算符和括号将运算对象(也称操作数)连接起来的、符合C++语法规则的式子,称C++算术表达式。 运算对象包括常量、变量、函数等。例如,下面是一个合法的C++算术表达式: a*b/c-1.5+′a′ C++语言规定了运算符的优先级和结合性。在求解表达式时,先按运算符的优先级别高低次序执行,例如先乘除后加减。如有表达式a-b*c,b的左侧为减号,右侧为乘号,而乘号优先于减号,因此,相当于a-(b*c)。如果在一个运算对象两侧的运算符的优先级别相同,如a-b+c,则按规定的“结合方向”处理。

优先级与结合性 C++规定了各种运算符的结合方向(结合性),算术运算符的结合方向为“自左至右”,即先左后右,因此b先与减号结合,执行a-b的运算,再执行加c的运算。 “自左至右的结合方向”又称“左结合性”,即运算对象先与左面的运算符结合。以后可以看到有些运算符的结合方向为“自右至左”,即右结合性(例如赋值运算符)。 关于“结合性”的概念在其他一些高级语言中是没有的,是C和C++的特点之一,希望能弄清楚。附录B列出了所有运算符以及它们的优先级别和结合性。

运算符优先级 高 低 括号 ++,--,sizeof *, /, % +, - <, <=, >, >= ==, != 位运算 && || ?: 赋值运算(复合赋值运算) 逗号运算 高 MSDN:Operator Precedence and Associativity 低

2.5.3 表达式中各类数值型数据间的混合运算 在表达式中常遇到不同类型数据之间进行运算,如 10+′a′+1.5-8765.1234*′b′ 在进行运算时,不同类型的数据要先转换成同一类型,然后进行运算。转换的规则按图2.7所示。

假设已指定i为整型变量,f为float变量,d为double型变量,e为long型,有下面表达式: 10+′a′+i*f-d/e 运算次序为: ①进行10+′a′的运算,先将′a′转换成整数97,运算结果为107。 ②进行i*f的运算。先将i与f都转换成double型,运算结果为double型。 ③整数107与i*f的积相加。先将整数107转换成双精度数(小数点后加若干个0,即107.000…00),结果为double型。 ④将变量e转换成double型,d/e结果为double型。 ⑤将10+′a′+i*f的结果与d/e的商相减,结果为double型。 上述的类型转换是由系统自动进行的。

2.5.4 自增和自减运算符 在C和C++中,常在表达式中使用自增(++)和自减(--)运算符,他们的作用是使变量的值增1或减1。 如:++i(先加1,后使用,如果i的原值为3,则执行j=++i后,j的值为4)(前置运算符) --i (先减1,后使用,如果i的原值为3,则执行j=--i后,j的值为2)(前置运算符) i++ (先使用,后加1,如果i的原值为3,则执行j=i++后,j的值为3,然后i变为4) (后置运算符) i--(先使用,后减1,如果i的原值为3,则执行j=i--后,j的值为3,然后i变为2)(后置运算符)

请注意: (1) 自增运算符(++)和自减运算符(--)只能用于变量,而不能用于常量或表达式。 (2) ++和--的结合方向是“自右至左”,见附录B。 (3) 自增运算符(++)和自减运算符(--)使用十分灵活,但在很多情况下可能出现歧义性,产生“意想不到”的副作用。 (4) 自增(减)运算符在C++程序中是经常见到的,常用于循环语句中,使循环变量自动加1。也用于指针变量,使指针指向下一个地址。

2.5.5 强制类型转换运算符 在表达式中不同类型的数据会自动地转换类型,以进行运算。有时程序编制者还可以利用强制类型转换运算符将一个表达式转换成所需类型。例如: (double)a (将a转换成double类型) (int)(x+y) (将x+y的值转换成整型) (float)(5%3) (将5%3的值转换成float型) 强制类型转换的一般形式为 (类型名)(表达式) 注意:需要说明的是在强制类型转换时,得到一个所需类型的中间变量,但原来变量的类型未发生变化。 例如:(int)x 如:原指定为float型,值为3.6,进行强制类型运算后得到一个int型的中间变量,它的值等于3,而x原来的类型和值都不变。

此外,在函数调用时,有时为了使实参与形参类型一致,可以用强制类型转换运算符得到一个所需类型的参数。 例2.4 强制类型转换。 #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 x的型仍为float型,值仍等于3.6。 此外,在函数调用时,有时为了使实参与形参类型一致,可以用强制类型转换运算符得到一个所需类型的参数。

2.6 赋值运算符与赋值表达式 2.6.1 赋值运算符 赋值符号“=”就是赋值运算符,它的作用是将一个数据赋给一个变量。如“a=3”的作用是执行一次赋值操作(或称赋值运算)。把常量3赋给变量a。也可以将一个表达式的值赋给一个变量。

2.6.2 赋值过程中的类型转换 如果赋值运算符两侧的类型不一致,但都是数值型或字符型时,在赋值时会自动进行类型转换。 (1) 将浮点型数据(包括单、双精度)赋给整型变量时,舍弃其小数部分。 (2) 将整型数据赋给浮点型变量时,数值不变,但以指数形式存储到变量中。 (3) 将一个double型数据赋给float变量时,要注意数值范围不能溢出。 (4) 字符型数据赋给整型变量,将字符的ASCII码赋给整型变量。

赋值过程中的类型转换 (5) 将一个int、short或long型数据赋给一个char型变量,只将其低8位原封不动地送到char型变量(发生截断)。 例如:short int i=289; char c; c=i; //将一个int型数据赋给一个char型变量 赋值情况见图。为方便起见,以一个int型数据占两个字节(16位)的情况来说明。

(6) 将signed(有符号)型数据赋给长度相同的unsigned(无符号)型变量,将存储单元内容原样照搬(连原有的符号位也作为数值一起传送)。 例2.5 将有符号数据传送给无符号变量。 #include <iostream> using namespace std; int main( ) { unsigned short a; short int b=-1; a=b; cout<<″a=″<<a<<endl; return 0; } 运行结果为:65535 赋给b的值是-1,怎么会得到65535呢?

2.6.3 复合的赋值运算符 在赋值符“=”之前加上其他运算符,可以构成复合的运算符。如果在“=”前加一个“+”运算符就成了复合运算符“+=”。例如,可以有 a+=3 等价于 a=a+3 x*=y+8 等价于 x=x*(y+8) x%=3 等价于 x=x%3 以“a+=3”为例来说明,它相当于使a进行一次自加3的操作。即先使a加3,再赋给a。 同样,“x*=y+8”的作用是使x乘以(y+8),再赋给x。 凡是二元(二目)运算符,都可以与赋值符一起组合成复合赋值符。C++可以使用以下几种复合赋值运算符: +=,-=,*=,/=,%=,<<=,>>=,&=,∧=,|= 其中后5种是有关位运算的。

2.6.4 赋值表达式 由赋值运算符将一个变量和一个表达式连接起来的式子称为“赋值表达式”。 它的一般形式为 <变量> <赋值运算符> <表达式> 如“a=5”是一个赋值表达式。 对赋值表达式求解的过程是:先求赋值运算符右侧的“表达式”的值,然后赋给赋值运算符左侧的变量。一个表达式应该有一个值。赋值运算符左侧的标识符称为“左值”(left value)。并不是任何对象都可以作为左值的,变量可以作为左值,而表达式a+b就不能作为左值,常变量也不能作为左值,因为常变量不能被赋值。

2.7 逗号运算符与逗号表达式 C++提供一种特殊的运算符——逗号运算符。用它将两个表达式连接起来。如: 3+5,6+8 称为逗号表达式,又称为“顺序求值运算符”。 逗号表达式的一般形式为: 表达式1,表达式2 逗号表达式的求解过程是:先求解表达式1,再求解表达式2。整个逗号表达式的值是表达式2的值。 如,逗号表达式: a=3*5,a*4 赋值运算符的优先级别高于逗号运算符, 先求解a=3*5。经计算和赋值后得到a的值为15,然后求解a*4,整个逗号表达式的值为60。 一个逗号表达式又可以与另一个表达式组成一个新的逗号表达式,如: (a=3*5,a*4),a+5