Presentation is loading. Please wait.

Presentation is loading. Please wait.

C++语言程序设计教程 第2章 数据类型与表达式 第2章 数据类型与表达式 制作人:杨进才 沈显君.

Similar presentations


Presentation on theme: "C++语言程序设计教程 第2章 数据类型与表达式 第2章 数据类型与表达式 制作人:杨进才 沈显君."— Presentation transcript:

1 C++语言程序设计教程 第2章 数据类型与表达式 第2章 数据类型与表达式 制作人:杨进才 沈显君

2 第2章 数据类型与表达式 学习目标 掌握各种基本数据类型的定义名、长度、表示范围; 掌握各种类型的数值的表示;
C++语言程序设计教程 第2章 数据类型与表达式 C++语言程序设计教程 第1章 C++编程简介 第2章 数据类型与表达式 学习目标 掌握各种基本数据类型的定义名、长度、表示范围; 掌握各种类型的数值的表示; 弄清变量以及变量赋值的实质,标识符的构成规则,会定义各种类型的变量以及定义变量的初值; 弄清变量与常量,三种常量之间的区别; 掌握常用运算符的含义、优先级、结合性、使用方法; 理解表达式的构成规则、表达式的左值和右值的含义,会根据计算式写出相应的表达式; 掌握隐式类型转换和显式类型转换的概念和使用方式,能够使用显式类型转换强制进行表达式值的转换。

3 C++语言程序设计教程 第1章 C++编程简介 C++语言程序设计教程 第2章 数据类型与表达式 2.1 数据类型概述 C++中新增

4 2.2 基本数据类型 2.2.1 字符集 字符集是构成C++程序语句的最小元素。字符集由下列各类字符构成: 数据类型与表达式
第1章 C++编程简介 C++语言程序设计教程 第2章 数据类型与表达式 2.2 基本数据类型 2.2.1 字符集 字符集是构成C++程序语句的最小元素。字符集由下列各类字符构成: (1) 英文字母 A~Z, a~z (2) 数字 0-9 (3) 特殊字符: 空格 # % ^ & * _(下划线) - + = | ~ < > / \ ` ? , . ; ( ) [ ] { }

5 C++语言程序设计教程 第1章 C++编程简介 C++语言程序设计教程 第2章 数据类型与表达式 2.2.2 基本数据类型 表中符号[ ]表示可选,表示其中的内容可以缺省,也有默认的意思。如[signed] char表示char类型默认为signed char;使用类型名定义一个变量时,[]中的内容可以省略。 类别 数据类型定义名 表示范围(存储值的范围) 字节数 有效位数 bool false, true (0,1) 1 char [signed] char '\x80'~'\x7F' (-128~127) unsigned char '\x00'~'\xFF' (0~255) wchar_t '\x0000'~'\xFFFF'(0~65535) 2 int [signed] int -231~231-1 ( ~ ) 4 signed [int] -231~231-1 unsigned [int] 0~ (0~ ) [signed] short [int] -215~215-1 (-32768~32767) [signed] long [int] unsigned short [int] 0~ (0~65535) unsigned long [int] 0~232-1 float ±3.4e±38 7 double ±1.7e±308 8 15 long double ±1.7e±4932 10(或8) 19 void 整型数据的长度(存储空间)随系统的不同而不同,在16位系统下如DOS,其长度与短整型相同,占有16bit。在32位系统如Linux、Unix、Windows NT系统下,长度为32bit。表中的整型是32位系统下的整型。 整型int默认为有符号整型,即:类型signed int与int相同,所以signed short int、signed long int分别与short int、long int相同。 符号的类型修饰signed, unsigned与长短的修饰short,long可以随意组合,且前后顺序随意。 如果int型有长短修饰或符号修饰时,int也可缺省。 C++中提供wchar_t类型,用于描述像汉字这样的大字符集。汉字字符集有简体字符集GB2312、繁体字符集Big5。在C++中,对于大字符集字符可用多个char类型的数据来实现,wchar_t类型主要用在国际化程序的实现中。 。 有效位数栏中的数据是指浮点数十进制的有效位数,包括整数与小数部分。 空值型void用于描述没有返回值的函数以及通用指针类型。 有的编译器如visual C++对long double采用8字节存储。

6 C++语言程序设计教程 第1章 C++编程简介 C++语言程序设计教程 第2章 数据类型与表达式 2.3 数值 数值就是指直接参加运算的数。在有的书上称为文字常量(literal constant)或常量。文字是程序中直接用符号表示的数值,常量是指在程序运行过程中,其值不能被改变的量。出现在程序中的数值在程序运行过程中是不能被改变的,故称之为文字常量。通俗说,文字常量就是数值。 2.3.1 整型数 各种进制的整数表示如下: (1) 十进制整数 十进制是整型数据的默认表示形式,不需要加任何前缀。我们熟悉的数学中的数据就是用十进制表示的。十进制使用的数字有0、1、2、3、4、5、6、7、8、9。如:123、456、1、-123都是十进制整数。 (2) 八进制整数 以数字0作为前缀, 数字为0、1、2、3、4、5、6、7。如:0123表示八进制数123即(123)8。其值为:1×82+2×81+3×80,等于十进制数83。-017表示八进制数(-17)8,即十进制数-15。

7 各种类型整数的表示 注意: (3)十六进制整数
C++语言程序设计教程 第2章 数据类型与表达式 C++语言程序设计教程 第1章 C++编程简介 (3)十六进制整数 以0x或0X开头, 数字有0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。其中英文字母A~F代表的值为10~15。 如:0x12B表示十六进制数(12B)16,其值为:1×162+2×161+11×160,等于十进制数299。-0x17等于十进制数-23。 十六进制使用的英文字母除了使用大写字母外还可以使用a、b、c、d、e、f小写字母,并且大小写可以混用。 注意: 各进制数只能使用其规定的数字, N进制使用的数字为0~N-1。如0128是不合法的八进制数,因为8不是八进制所使用的数字。 八进制整数前不能省略0,省略了0就是十进制数。 各种类型整数的表示 (1)基本整型数 基本整型数不需要在数字后加任何后缀。在16位系统下,整型数的长度为16bit(2字节) 如:12、-1235等是用十进制表示的整型数。如0xc、0xfb2d是用十六进制表示的整型数,其值分别为12、-1235。 在32位系统下,长度为32bit(4字节),如:12、-1235等。12、-1235用十六进制表示分别为0xc、0xfffffb2d。

8 C++语言程序设计教程 第2章 数据类型与表达式 C++语言程序设计教程 第1章 C++编程简介 (2) 长整型数 长整型的长度与取值范围与32位系统下的基本整型一样。表示方法则是在数字后加l或L做标记。如:345667L、-123L、12l。 (3)无符号整型数 无符号整型数据的长度与基本整型常量一样。但取值范围不同,16位系统下,范围为0~65535;32位系统下范围为0~ 。表示方法是在数字后加u或U做标记。如:235u、12U。其中12u和12的区别是12u为无符号整数,12为有符号整数。 (4)无符号长整型数据 无符号长整型的长度与取值范围与32位系统下的基本整型一样。表示方法是在数字后同时跟有l(或L)和u(或U)。如:235Lu、12lU。 当同时跟有L和U,表示无符号长整型的常量时,先后顺序任意。如17896UL可表示成17896LU。 注意: 为了区别表示长整型数字母l与数字1,一般使用大写L; 在定义一个整型数时,不管采用哪种进制形式,都不要超过其表示范围。

9 2.3.2 浮点型数 注意: 浮点型数即我们平常使用的实型数,由整数部分和小数部分组成。通常有两种表示形式: (1) 十进制数形式
C++语言程序设计教程 第2章 数据类型与表达式 C++语言程序设计教程 第1章 C++编程简介 2.3.2 浮点型数 浮点型数即我们平常使用的实型数,由整数部分和小数部分组成。通常有两种表示形式: (1) 十进制数形式 由0~9和小数点组成。如:23.456、-12.3等。 (2) 指数形式 表示格式为: 十进制浮点型数|基本整型数1 E 基本整型数2 符号 | 表示“或”。 十进制浮点型数与基本整型数1是尾数; E或e代表底数10; 基本整型数2为指数。如:1.3e4、-12.5e-4分别表示1.3×104和-12.5×10-4。 注意: 当以指数形式表示一个实数时,整数部分和小数部分可以省略其一,但不能都省略。如.123E5、123.E-6都是正确的,但不能写成E-2这种形式。 浮点数默认为双精度浮点型,在内存中占8个字节,取值范围为±1.7e±308。如果带有后缀F或f, 则为float类型,在内存中占4个字节,取值范围为±3.4e±38

10 2.3.3 字符型数 字符数是用英文单引号括起来的一个字符。如:'a','A'等。
C++语言程序设计教程 第1章 C++编程简介 C++语言程序设计教程 第2章 数据类型与表达式 2.3.3 字符型数 字符数是用英文单引号括起来的一个字符。如:'a','A'等。 有些ASCII码字符如回车、退格等不能直接用在用单引号中。这些数据可用转义序列来表示 : 转义符形式1: \字符助记符 转义符形式2: \字符的ASCII码值 字符助记符只有一个字母,例如n、t分别为newline(换行符)、table(制表符)的助记符。故\n、\t分别表示换行符与制表符。 字符的ASCII码值的形式为\ooo与\xhh, 其中\ooo表示3位八进制数,\xhh表示2位十六进制数。例如, 制表符table用第2种形式的转义序列表示为\011或\x09。\ooo中,ooo为不超过3位的八进制数字,可以不以0开头。

11 常用预定义的转义序列 C++语言程序设计教程 第1章 C++编程简介 转义序列 含义 ASCII码名 ASCII码值 \n
换行符,相当于按enter键, 包括回车、换行 NL(LF) D,A \t 横向(水平)跳到下一制表位置, 相当于按tab键 HT 9 \v 竖向跳格 VT B \b 退格, 相当于按backspace键 BS 8 \r 回车(return) CR D \f 走纸(feed)换页 FF C \a 鸣铃(alert) BEL 7 \\ 反斜线符 \ 5C \' 单引号 ' 27 \" 双引号 " 22 \ooo ooo为3位八进制数 \xhh hh为2位十六进制数 hh

12 注意: 转义序列的用法举例 7 8 9 10 11 12 13 14 15 16 void main( ) {
C++语言程序设计教程 第1章 C++编程简介 转义序列的用法举例 7 8 9 10 11 12 13 14 15 16 void main( ) { cout<<'A' <<'\t' <<';' <<'\n'; cout<<'\102'<<'\011'<<'\073'<<'\012'; cout<<'\103'<<'\11' <<'\73' <<'\12'; cout<<'\x44'<<'\x09'<<'\x3b'<<'\x0a'; cout<<'\x45'<<'\x9' <<'\x3b'<<'\xa'; cout<<"\x46\x09\x3b\x0d\x0a"; cout<<"\xcd\xcd\xcd\xcd\xcd"<<endl; } 以八进制表示字符的ASCII 码值 以八进制表示字符的ASCII 码值,省略了八进制数前面的0 以十六进制表示字符的ASCII 码值 以十六进制表示字符的ASCII 码值,省略了前面的0 字符串中采用转义序列输出ASCII码字符。 运行结果 A ; B ; C ; D ; E ; F ; 屯屯 注意: 由于一个汉字字符包括两个字符,因此不能在单引号中使用汉字。

13 2.3.4 字符串 2.3.5 布尔型数 注意: 字符串数值简称字符串,是使用一对双引号括起来的字符序列。例如, 英文串:
C++语言程序设计教程 第1章 C++编程简介 C++语言程序设计教程 第2章 数据类型与表达式 2.3.4 字符串 字符串数值简称字符串,是使用一对双引号括起来的字符序列。例如, 英文串: "This is a string\n" 中文串: "我们都是中国人\t我们热爱自己的祖国\n" 字符串与字符比较的区别: (1) 字符由单引号括起来,字符串由双引号括起来。如:'a'与"a"分别表示a字符与a这个字符串。 (2) 字符只能是单个字符,字符串则可是零个或多个字符。如:'abd'是不合法的。但""是合法的,表示空串。 (3) 字符占一个字节的内存空间,字符串占内存字节数等于字符串的长度加1。系统自动在字符串末尾添加'\0'作为结束标记。如:'a'在内存中占用一个字节;而"a" 在内存中占用两个字节,分别存放a和\0。 2.3.5 布尔型数 布尔型数值只有两个:true(真)和false(假)。在C++的算术运算式中,把布尔型数据当作整型数据,true与false分别当作1与0。在逻辑运算式中则把非0数据当成true, 把0当成false。 注意: 不能将true与false写成TRUE与FALSE。

14 C++语言程序设计教程 第1章 C++编程简介 C++语言程序设计教程 第2章 数据类型与表达式 2.4 变量 变量是存储数据的内存区域,变量名是这块区域的名字或助记符。变量之所以叫变量是因为在程序运行的过程中变量标识的内存区中的数据可以改变。在C++中变量取名要遵循标识符的构成规则。 2.4.1 标识符与关键字 标识符用来标识程序中的一些实体。标识符的构成规则如下: (1) 以大写字母、小写字母或下划线_开头; (2) 可以由大写字母、小写字母、下划线、数字组成; (3) 大写字母与小写字母分别代表不同的标识符; (4) 不能是C++的关键字。 C++的关键字是C++预定义的单词,也叫保留字,意思是为C++语言保留,不能用作标识符。

15 C++的关键字表 数据类型与表达式 C++语言程序设计教程 第1章 C++编程简介 C++语言程序设计教程 第2章 asm
const_cast explicit inline public struct typename auto continue export int register switch union bool default extern long reinterpret_cast template unsigned break delete false mutable return this using case do float namespace short throw virtual catch double for new signed true void char dynamic_cast friend operator sizeof try volatile class else goto private static typedef wchar_t const enum if protected static_cast typeid while

16 2.4.2 变量的定义与赋初值 变量定义的一般格式为: 数据类型 变量名1,变量名2,…,变量名n; 数据类型与表达式 例如:
C++语言程序设计教程 第1章 C++编程简介 C++语言程序设计教程 第2章 数据类型与表达式 2.4.2 变量的定义与赋初值 变量定义的一般格式为: 数据类型 变量名1,变量名2,…,变量名n; 例如: int sum, area; float x,y,z; 给变量赋初值的格式如下: 数据类型 变量名1=初值1,变量名2=初值2,…,变量名n=初值n; 例如: int sum=100; double pi=3.1416; char c1='a', c2='b';

17 2.5 常量 变量定义的l另一种格式为: 数据类型 变量名1(初值1),变量名2(初值2),…,变量名n(初值n); 例如:
C++语言程序设计教程 第1章 C++编程简介 C++语言程序设计教程 第2章 数据类型与表达式 变量定义的l另一种格式为: 数据类型 变量名1(初值1),变量名2(初值2),…,变量名n(初值n); 例如: int sum(100); double pi(3.1416); char c1('a'), c2('b'); 2.5 常量 常量是指在程序运行过程中,其值不能被改变的量。因此,一个具体的数值称为文字常量。如:i=255; area=r*r*3.14; 在程序中直接使用数值有两个问题: (1)可读性差 ; (2)可维护性差 ;

18 2.5.1 符号常量 2.5.2 常变量 注意: C++符号常量的定义形式如下: 数据类型与表达式 例如:
第1章 C++编程简介 C++语言程序设计教程 第2章 数据类型与表达式 2.5.1 符号常量 C++符号常量的定义形式如下: #define 符号常量名 数值 例如: #define MaxChar 255 #define PI 注意: 定义符号常量时不能用赋值符,#define PI=3.14是错误的。 由于define 是预处理指令,语句不能以分号结尾。 2.5.2 常变量 const可以与数据类型说明颠倒。 C++为符号常量提供了一种新方法,格式为: const 数据类型 符号常量名 = 数值; 用const修饰后,变量的值就不能改变了,实质上是一种“常变量”。

19 注意: 数据类型与表达式 例如: const short int MaxChar=255; const float PI=3.14;
第2章 数据类型与表达式 C++语言程序设计教程 第1章 C++编程简介 例如: const short int MaxChar=255; const float PI=3.14; 三种常量比较表: 文字常量 符号常量 常变量 i=255; area=r*r*3.14; #define MaxChar 255 #define PI const short int MaxChar=255; const float PI=3.14; 与直接使用文字常量相比,使用符号常量增强了程序的可读性,可维护性。 常变量与变量定义的格式相似,使程序保持良好的风格。 常变量可以按照不同的需要选择合适的数据类型,节省内存空间,在运算式中有明确的类型。 注意: 在定义常变量时一定要赋初值。 例如:const float PI; //错误,定义时没有给出初值 常变量不是变量,在程序中间不能更新其值。 例如:PI= ; //错误!常量不能被改变

20 表达式是运算符与数据连接起来的表达运算的式子,表达式也称运算式。
C++语言程序设计教程 第1章 C++编程简介 C++语言程序设计教程 第2章 数据类型与表达式 2.6 运算符与表达式 运算符是描述对数据进行的运算(操作)、体现数据之间运算关系的符号,运算符也叫操作符。 表达式是运算符与数据连接起来的表达运算的式子,表达式也称运算式。 2.6.1 优先级与结合性 优先级是指表达式中运算符运算的顺序。当一个表达式中包含多个运算符时,先进行优先级高的运算,再进行优先级低的运算。如果表达式中出现了多个相同优先级的运算,运算顺序就要看运算符的结合性了。 结合性是指操作数左右两边运算符的优先级相同时,优先和哪个运算符结合起来,进行运算。运算符的结合顺序有两种:左结合和右结合。 左结合 num1 op1 num2 op2 num (num1 op1 num2) op2 num3 右结合 num1 op1 num2 op2 num num1 op1 (num2 op2 num3)

21 C++语言程序设计教程 第1章 C++编程简介 C++语言程序设计教程 第2章 数据类型与表达式 2.6.2 算术运算符 基本算术运算符及其含义: 优先级 运算符 含义 结合性 2 + 正号 从右向左 - 负号 4 * 从左向右 / % 取余 5 (1) 算术运算符的意义、优先级与数学中一致:+(正号), -(负号)是一元运算,优先级高于二元运算,*、/、%优先级高于+(加)、-(减)运算。 表中优先级数字小的优先级高 例如:a=10; b=5; a+b*-1; 得到结果5 (2) %要求两个操作数的值必须是整数或字符型数。“操作数1%操作数2”计算结果是操作数1被操作数2除的余数。当两个操作数都是正数时,结果为正;如果有一个(或两个)操作数为负,余数的符号取决于机器。 21%6 //结果是3 4%2 //结果是0 21%-5 //机器相关:结果为-1或1

22 2.6.2算术运算符 注意: 基本算术运算符及其含义:
C++语言程序设计教程 第1章 C++编程简介 C++语言程序设计教程 第2章 数据类型与表达式 2.6.2算术运算符 基本算术运算符及其含义: 优先级 运算符 含义 结合性 2 + 正号 从右向左 - 负号 4 * 从左向右 / % 取余 5 (3) 当/运算符用于两个整数相除时,如果商含有小数部分,将被截掉。如果要进行通常意义的除运算,则至少应保证除数或被除数中有一个是浮点数或双精度数。 5/4 //结果是1 4/5 //结果是0 5/4.0 //结果是1.25 4.0/5 //结果是0.8 (4) 在使用算术运算符时,需要注意有关算术表达式求值溢出的处理问题; short i=32767,j,k; j=i+1; k=i+2; cout<<"j="<<j <<", k="<<k<<endl; 执行结果为:j=-32768, k=-32767 注意: 在书写除法运算式时,通常将参加运算的整数值后补上小数点与0作为双精度(double)常量参加运算。

23 C++语言程序设计教程 第1章 C++编程简介 C++语言程序设计教程 第2章 数据类型与表达式 2.6.3 关系运算符 关系运算符及其含义: 优先级 运算符 含义 结合性 7 > 大于 从左向右 < 小于 >= 大于等于 <= 小于等于 8 == 等于 != 不等于 (1)若关系运算符的计算结果继续用在表达式中,true与false分别当成了1与0。 。 (2)关系运算符的操作数可以是任何基本数据类型的数据,但由于实数(float)在计算机中只能近似地表示一个数,所以,一般不能直接进行比较。当需要对两个实数进行==、!=比较时,通常的做法是指定一个极小的精度值,若两实数的差在这个精度之内时,就认为两实数相等,否则为不等。 x==y 应写成 fabs(x-y)<1e-6 x!=y 应写成 fabs(x-y)>1e-6 //fabs(x)求double类型数x的绝对值 (3)关系表达式就是由关系运算符将两个操作数连接起来的式子。这两个操作数可以为常量、变量、算术表达式等。 例如:a+b>c+d 'a'<'b'+'c' a>b>=c>d a == b<c 注意: 关系运算符的比较运算是由两个等号组成,不要误写为赋值运算符=。

24 2.6.4 逻辑运算符 逻辑运算符操作数类型为bool型,返回类型亦为bool型。 逻辑运算符列表 逻辑运算的功能表 数据类型与表达式
C++语言程序设计教程 第2章 数据类型与表达式 C++语言程序设计教程 第1章 C++编程简介 2.6.4 逻辑运算符 逻辑运算符操作数类型为bool型,返回类型亦为bool型。 逻辑运算符列表 逻辑运算的功能表 优先级 运算符 含义 结合性 2 取反 从右向左 12 && 从左向右 13 || p q !p p&&q p||q 1 (1)逻辑运算符的操作数为bool型,当为其它数据类型时,将它转换成bool值参加运算。 设a=10,b=5,c=-3 则!a的值为 0; a&&b的值为1; a || b的值为1; (2) C++对于二元运算符&&和||可进行短路求值(short-circuit evaluation)。由于&&与||表达式按从左到右的顺序进行计算,如果根据左边的计算结果能得到整个逻辑表达式的结果,右边的计算就不需要进行了,该规则叫短路求值。 例如:(num!=0)&&(1/num>0.5) (3)当表示的逻辑关系比较复杂时,用小括号将操作数括起来是一种比较好的方法。

25 2.6.5 位运算符 位运算分为移位运算与按位逻辑运算 unsigned char c(135),d (43);
第1章 C++编程简介 C++语言程序设计教程 第2章 数据类型与表达式 2.6.5 位运算符 位运算分为移位运算与按位逻辑运算 优先级 运算符 含义 结合性 2 ~ 位求反 从右向左 6 << 左移 从左向右 >> 右移 9 & 位与 10 ^ 位异或 11 | 位或 unsigned char c(135),d (43); 二进制表示分别为 和 (1) 运算符 ~ 将操作数逐位取反,即将原来为1的位变为0,原来为0的位变为1。例如,按位求反~c的结果为 。 (2) 运算符 & 将两个操作数对应位逐一地进行逻辑与运算。与运算的规则为“见零则零”,即两个数中只要有一个为0,则其逻辑与的结果就为0。 (3)运算符 | 将两个操作数对应位逐一地进行逻辑或运算。逻辑或运算的规则为“见壹则壹”,即两个数中只要有一个为1,则其逻辑或的结果就为1。 (4)运算符 ^ 将两个操作数对应位逐一地进行逻辑异或运算。逻辑异或运算的规则为“同则零,异则壹”,即两个数只要不同,则其逻辑异或的结果就为1;否则为0。

26 C++语言程序设计教程 第2章 数据类型与表达式 C++语言程序设计教程 第1章 C++编程简介 2.6.5 位运算符 (5) 运算符 << 将左操作数向左移动其右操作数所指定的位数,移出的位补以0。将一个数左移一位,相当将该数乘以2;左移两位,相当将该数乘以4。一般说来,将一个数左移n位,就相当将该数乘以2n。所以,在程序中,常用左移位来进行快速的乘法运算。 (6) >> 将左操作数向右移动其右操作数所要求的位数,移出的位补以0。将一个数右移n位,相当于将该数除以2n。这与整型和字符型数据的除法运算完全一致,所以在程序中常用右移位来进行快速的除法运算。 注意: 位运算符是对其操作数按其二进制形式逐位地进行逻辑运算或移位操作的, 运算对象为bool、char、short、int等类型数, 但不得是实型数据。 用移位方法进行乘法运算时,同样要注意溢出问题。 按位左移运算符与插入运算符同形(同一个符号),按位右移运算符与提取运算符同形。那么编译器是如何来区分cout<<7<<3;是将7左移3位,还是向屏幕上输出7、3呢? 编译器将把该表达式解释成向屏幕输出7、3,这是由于cout是C++语言中预定义的输出流类的对象,在该对象所属的类中,对运算符<<所执行的操作进行了新的定义。对于按位右移与提取运算符,编译器也是按此原则解释。

27 2.6.6 赋值运算符 赋值运算符表 数据类型与表达式 C++语言程序设计教程 第1章 C++编程简介 C++语言程序设计教程 第2章
优先级 运算符 含义 举例 结合性 15 = 赋值 从右向左 *= 乘赋值 a*=b 等价于a=a*b /= 除赋值 a/=b 等价于a=a/b %= 取余赋值 a%=b 等价于a=a%b += 加赋值 a+=b等价于a=a+b -= 减赋值 a-=b 等价于a=a-b <<= 左移赋值 a<<=b等价于a=a<<b >>= 右移赋值 a>>=b等价于a=a>>b &= 位与赋值 a&=b等价于a=a&b ^= 位异或赋值 a^=b等价于a=a^b |= 位或赋值 a|=b等价于a=a|b

28 2.6.6 赋值运算符 简单赋值运算符的使用格式: 左表达式 = 右表达式
C++语言程序设计教程 第2章 数据类型与表达式 C++语言程序设计教程 第1章 C++编程简介 2.6.6 赋值运算符 简单赋值运算符的使用格式: 左表达式 = 右表达式 其功能是将右表达式(右操作数)的值放到左表达式表示的内存单元中,因此左表达式一般是变量或表示某个地址的表达式,称为左值,在运算中作为地址使用。右表达式在赋值运算中是取其值使用,称为右值。所有赋值运算左表达式都要求是左值。

29 2.6.6 赋值运算符 复合赋值运算符的运算过程为:先将两个表达式做运算符所规定的算术或位运算,然后将运算的结果赋给左表达式。
C++语言程序设计教程 第2章 数据类型与表达式 C++语言程序设计教程 第1章 C++编程简介 2.6.6 赋值运算符 复合赋值运算符的运算过程为:先将两个表达式做运算符所规定的算术或位运算,然后将运算的结果赋给左表达式。 左表达式 @= 右表达式 ; 左表达式 =(左表达式 @ 右表达式); 例如:设a和b的值分别为2和6,复合赋值运算式b*=a+3的计算过程为:   ① 先计算复合赋值运算符的右表达式的值,即a+3的和,结果为5;   ② 然后,做复合赋值运算符所规定的算术运算,即求b与上述结果的乘积,结果为30;   ③ 最后进行赋值运算,将上述运算结果赋给复合赋值运算符的左操作数b。同时,整个表达式的值也为30。

30 C++语言程序设计教程 第1章 C++编程简介 C++语言程序设计教程 第 2章 数据类型与表达式 2.6.6 赋值运算符 关于赋值运算符的说明: (1) 用赋值运算符=连接起来的表达式叫做赋值表达式。赋值表达式是C++语言(包括C语言)中所特有的,其它大多数语言中,只有赋值语句而没有赋值表达式这一语法要素。赋值表达式仍可作为操作数进行运算,赋值表达式的类型为左边变量的类型,其返回值为赋值后左边变量的值。 float x; x=2.6; //返回值为2.6, 类型为float; (2) 复合赋值运算符所表示的表达式不仅比一般赋值运算符表示的表达式简练,而且所生成的目标代码也较少,因此,C++语言程序中应尽量采用复合赋值运算符的形式表示。 (3) 在C++中还可以连续赋值,赋值运算符具有右结合性. x=y= 2.6; // 它相当于:x=(y=2.6); a=b=3+8; //先做3+8,然后将11赋给b,再将b的值11赋给a。 c=b*=a+3; //运算分解为 ①a+3 ②b=b*(a+3) ③c=b

31 2.6.7 ++、--运算符 这两个运算符都前置和后置两种形式。所谓前置是指运算符在操作数的前面,后置是指运算符在操作数的后面。
C++语言程序设计教程 第1章 C++编程简介 C++语言程序设计教程 第2章 数据类型与表达式 、--运算符 这两个运算符都前置和后置两种形式。所谓前置是指运算符在操作数的前面,后置是指运算符在操作数的后面。 例如: i++; //++后置 --j; //--前置 优先级 运算符 含义 结合性 1 ++ 后置自增 从左向右 -- 后置自减 2 前置自增 从右向左 前置自减 (1) 都是使操作数的值增1或减1,但对表达式的值的影响却完全不同。 前置形式 int i=5; x=++i; y=i; // i 先加1(增值)后再赋给x (i=6, x=6,y=6) int i=5; ++i; x=y=i; // (i=6, y=6,x=6) 后置形式 int i=5; x=i++; y=i; // i 赋给后再加1(x=5, i=6,y=6) int i=5; i++; x=y=i; // (i=6, y=6,x=6) 前缀运算是先变化后运算,后缀运算是先运算后变化。 (2) 由于++、--运算符内含了赋值运算,所以运算对象只能左值,不能作用于常量和表达式。5++、 (x+y)++都是不合法的。

32 2.6.8 其它运算符 1. 条件运算符 条件运算符也称三目运算符, 是C++中唯一的一个三目运算符。格式为:
第1章 C++编程简介 C++语言程序设计教程 第2章 数据类型与表达式 2.6.8 其它运算符 1. 条件运算符 条件运算符也称三目运算符, 是C++中唯一的一个三目运算符。格式为: d1 ?d2:d3 其中,d1,d2和d3分别是三个表达式。该运算符的功能是: ①先计算d1; ②如果d1的值为true(非0),返回d2的值作为整个条件运算表达式的值; ③如果d1的值为false(0),返回d3的值作为为整个条件运算表达式的值。 条件运算表达式的返回类型将是d2和d3这两个表达式中类型高(表示的数值范围大)的那种类型。 例如: a=(x>y ? 12 : 10.0); //若x>y(x>y的值为true), 将12赋给a; 否则a=10.0。条件运算表达式的返回类型为10.0的类型double。 x?y=a+10:y=3*a-1; //若x非0则把a+10的值赋给y,否则把3*a-1的值赋y

33 2.6.8 其它运算符 2. 逗号运算符 逗号可作分隔符使用,将若干变量隔开,如:int a,b,c;一般形式为:
第1章 C++编程简介 C++语言程序设计教程 第2章 数据类型与表达式 2.6.8 其它运算符 2. 逗号运算符 逗号可作分隔符使用,将若干变量隔开,如:int a,b,c;一般形式为: 表达式1,表达式2,……,表达式n; 逗号表达式的求解过程为:先求表达式1的值,再求表达式2的值……,最后求表达式n的值。整个逗号表达式结果的值是最后一个表达式n的值。它的类型也是最后一个表达式的类型。 例如: a=a+b, b=b*c, c=c-a; 设a=3,b=5,c=7,该表达式依次计算出a的值为8、b的值为35、c的值为-1、且整个表达式的值为-1。更进一步: x=(a=a+b, b=b*c, c=c-a) ; // x的值为-1。 逗号运算符还用在只允许出现一个表达式而又需要多个表达式才能完成运算的地方,用它将几个表达式连起来组成一个逗号表达式。 在C++语言所有运算符中,逗号表达式的优先级最低。

34 2.6.8 其它运算符 3.求字节运算符 sizeof 4.成员运算符
C++语言程序设计教程 第2章 数据类型与表达式 C++语言程序设计教程 第1章 C++编程简介 2.6.8 其它运算符 3.求字节运算符 sizeof sizeof运算符用来求得某种类型或某个变量所占字节数(长度)。它是一个单目运算符,用在类型说明符或变量名的左边,该运算符的使用形式如下: sizeof (类型说明符 | 变量名 | 常量 ) 例如:int a,b [10]; 在32位系统下,表达式sizeof(a)的值应该为4,与sizeof (int)的值相等;同样,sizeof (b)的值为40,它是数组b的所有元素所占的总内存字节数; sizeof(3.1)的值为8,即双精度数的长度。 4.成员运算符 (1)下标运算符 [ ] 。 (2) 取结构或联合变量成员运算符. (3) 通过指针取结构或联合体成员运算符->

35 2.6.8 其它运算符 5. 取地址运算符& 6. 取指针内容运算符* 该运算符用来获取某个变量的内存单元地址值,格式如下: 例如:
C++语言程序设计教程 第1章 C++编程简介 C++语言程序设计教程 第2章 数据类型与表达式 2.6.8 其它运算符 5. 取地址运算符& 该运算符用来获取某个变量的内存单元地址值,格式如下: & 变量名 例如: int a; &a表示取变量a的地址值,即是变量a在内存中被分配的内存地址值。 6. 取指针内容运算符* 取指针内容运算符是一个单目运算符,用来间接地获取某指针变量指向内存单元的值。 例如: int a=5; int *p=&a; 变量a标识的内存单元中存放的值为5,指针变量p指向变量a,将该运算符作用于p(即*p),表示取p指向的内存单元的内容,p指向的内存单元为变量a。因此,*p取出a存放于内存单元的值5。

36 C++语言程序设计教程 第2章 数据类型与表达式 C++语言程序设计教程 第1章 C++编程简介 7.括号运算符 该运算符是用来改变原来的优先级的,括号运算符的优先级最高。括号运算符可以包含使用(即嵌套),即在括号内还可以使用括号,在出现多重括号时,应该先作最内层括号,按从里向外的顺序进行。 其他其它运算符表 优先级 运算符 含义 结合性 1 ( ) 括号 从左向右 [ ] 数组下标 . 通过对象取成员 -> 通过指针取成员 2 & 取地址 从右向左 * 间接(通过指针)访问 sizeof 计算内存字节数 14 ?: 三元条件运算 16 , 逗号

37 8. 运算符优先级的规律 (1) 运算符的优先级按单目、双目、三目、赋值依次降低。
C++语言程序设计教程 第1章 C++编程简介 C++语言程序设计教程 第2章 数据类型与表达式 8. 运算符优先级的规律 (1) 运算符的优先级按单目、双目、三目、赋值依次降低。 单目运算是右结合的,旨在与右边的数结合在一起形成一个整体,因此优先级高。 算术运算中的+(正) 、-(负)、++、--、逻辑运算中的取非!, 按位运算中的取反~从各类运算中提取到单目运算中。 赋值运算之所以优先级低且为右结合,是因为要右边的表达式计算完后才赋值给左边的变量。 (2) 算术、移位、关系、按位、逻辑运算的优先级依次降低。 移位运算是一种高效的算术运算,看作算术运算的补充,优先级在算术运算后。 算术运算后的结果要进行比较,因此关系运算的优先级在算术、移位后。 关系运算得出的逻辑值要进行运算,所以逻辑运算优先级在关系运算后。 关系运算得出的逻辑值要进行运算,所以逻辑运算优先级在关系运算后。

38 2.6.9 表达式的使用 【例2-2】演示算术运算表达式的用法。 C++语言程序设计教程 第2章 数据类型与表达式 C++语言程序设计教程
第1章 C++编程简介 2.6.9 表达式的使用 【例2-2】演示算术运算表达式的用法。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 /******************************* * p2_2.cpp * * 演示算术运算表达式 * ********************************/ #include<iostream> using namespace std; void main() { int a; a=7*2+-3%5-4/3; float b; b= e3-5.6/0.03; cout<<a<<"\t"<<b<<endl; int m(3),n(4); a=m++- --n; cout<<a<<"\t"<<m<<"\t"<<n<<endl; } 运行结果

39 2.6.9 表达式的使用 【例2-3】演示逻辑运算表达式的用法。 0 1 1 1 2 2 2 1 2 C++语言程序设计教程 第2章
数据类型与表达式 C++语言程序设计教程 第1章 C++编程简介 2.6.9 表达式的使用 【例2-3】演示逻辑运算表达式的用法。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 /******************************* * p2_3.cpp * * 演示逻辑运算表达式 * ********************************/ #include<iostream> using namespace std; void main() { int x,y,z; x = y = z = 1; --x && ++y && ++z; cout<<x<<'\t'<<y<<'\t'<<z<<endl; ++x && ++y && ++z; ++x && y-- || ++z; } 运行结果

40 2.6.9 表达式的使用 【例2-3】演示逻辑运算表达式的用法。 10 20 10 10 20 30 C++语言程序设计教程 第2章
数据类型与表达式 C++语言程序设计教程 第1章 C++编程简介 2.6.9 表达式的使用 【例2-3】演示逻辑运算表达式的用法。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 /******************************* * p2_4.cpp * * 演示条件表达式 * ********************************/ #include<iostream> using namespace std; void main() { int i=10, j=20, k; k=(i<j) ? i : j; cout<<i<<'\t'<<j<<'\t'<<k<<endl; k=i-j ? i+j : i-3 ? j : i; } 运行结果

41 C++语言程序设计教程 第1章 C++编程简介 C++语言程序设计教程 第2章 数据类型与表达式 2.7 类型转换 C++语言支持不同数据类型的数据之间的混合运算。在对这样的表达式求值时,需要对其中的一些操作数进行类型转换。表达式中的类型转换有两种方式:自动转换和强制转换。 1.自动转换 各种类型的高低顺序如下所示: (1) 若参与运算量的类型不同,则先转换成同一类型,然后进行运算,转换按数据长度增加的方向进行,以保证精度不降低,且运算的结果(即表达式的值)的类型是运算式的最终类型。 (2) 所有的浮点型运算都是以双精度进行的,即使仅含float单精度运算的表达式,也要先转换成double型,再作运算。

42 2.7 类型转换 (3) bool、char型和short型参与运算时,必须先转换成int型。
第1章 C++编程简介 C++语言程序设计教程 第2章 数据类型与表达式 2.7 类型转换 (3) bool、char型和short型参与运算时,必须先转换成int型。 (4) 逻辑运算符要求参与运算的操作数必须是bool型,如果操作数是其它类型,编译系统会自动将非0数据转换为true,0转换为false。 (5) 位运算的操作数必须是整数,当二元位运算的操作数是不同类型的整数时,也会自动进行类型转换。 (6) 在赋值运算中,赋值号两边的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度比左边长时,可能丢失一部分数据,或降低精度。 float pi=3.1; //降低了精度 float f=3.5; //未降低精度 (7) 将signed型的整型变成较长的signed型的整型,unsigned型变成较长的整型时,原值以及正负符号不变。 int a=-2; long b=a; //b的值仍为-2

43 2.7 类型转换 (8) 将unsigned型和同长度的signed型互变时,其值根据自身所属范围发生适当的变化。
C++语言程序设计教程 第2章 数据类型与表达式 C++语言程序设计教程 第1章 C++编程简介 2.7 类型转换 (8) 将unsigned型和同长度的signed型互变时,其值根据自身所属范围发生适当的变化。 unsigned short a=65535; short int b=a; // b的值变成-1 short int a=-2; unsigned short b=a; // b的值变成65534 假设定义变量为:char c=1;float f=3.1; 表达式( '3' >= f ) + ( 'B' - c ) / f的类型转换图如下:

44 2.7 类型转换 2. 强制类型转换 旧式的C语言风格的强制类型转换的格式如下: 或 (类型说明符) 表达式
第1章 C++编程简介 C++语言程序设计教程 第2章 数据类型与表达式 2.7 类型转换 2. 强制类型转换 旧式的C语言风格的强制类型转换的格式如下: 类型说明符 (表达式) (类型说明符) 表达式 例如:int(a+b) //将a+b运算的结果转换成int型 5/float(3) //将3转换成float型 int a;float x=8.57; a=(int)x; //取整数部分,舍弃小数部分 结果a=8,x仍为float型,其值仍为8.57。 采用强制类型转换将高类型数据转换为低类型数据时,数据精度可能会受到损失。

45 2.7 类型转换 注意: 标准C++强制类型转换: static_cast <类型说明符> (表达式)
第2章 数据类型与表达式 C++语言程序设计教程 第1章 C++编程简介 2.7 类型转换 标准C++强制类型转换: static_cast <类型说明符> (表达式) reinterpret_cast<类型说明符> (表达式) const_cast <类型说明符> (表达式) dynamic_cast <类型说明符> (表达式) static_cast用于一般表达式的类型转换。 例如: int a;float x=8.57; a=static_cast <int> (x); //将变量x的类型转换成int型。 reinterpret_cast用于非标准的指针数据类型转换,如将void *转换成char *。 const_cast将const表达式转换成非常量类型, 常用于将限制const成员函数的const定义解除。 dynamic_cast用于进行对象指针的类型转换。 注意: 进行类型转换,只是将值进行了转换,原变量的类型不变。

46 2.8 表达式的副作用 对于表达式: exp1 + exp2; 先计算exp1还是exp2?不同的编译器有不同的做法。
C++语言程序设计教程 第1章 C++编程简介 C++语言程序设计教程 第2章 数据类型与表达式 2.8 表达式的副作用 对于表达式: exp1 + exp2; 先计算exp1还是exp2?不同的编译器有不同的做法。 在数学上,对于双目运算符,不论先计算哪一个操作数,要求最终计算结果一样。在C++中,在计算一个操作数时,该计算会改变(影响)另一个操作数,从而导致因操作数的不同计算次序产生不同的最终计算结果。对于因操作数计算的次序不同产生不同结果的表达式为带副作用的表达式。在计算时会影响其他操作数的值,引起副作用的运算符为带副作用的运算符。如++、--以及各种赋值运算符为带副作用的运算符。 x=1,(x+2)*(++x) 先计算x+2表达式的值为6; 若先计算++x,由于修改了x+2中x的值,计算结果为8。 C++中规定,先计算逻辑与(&&)和逻辑或(||)的第一个操作数,再计算第二个操作数,以便进行短路求值。条件(?:)、逗号(,)运算符也规定了操作数的计算次序,除此以外,其他运算符没有规定操作数的计算次序,计算次序由具体的编译器决定。因此在含这些运算符的表达式中,避免在操作数中引入带副作用的运算符。

47 2.9 本章小结 ◇ 字符集是构成C++程序语句的最小元素,程序的中除了字符串常量外,所有 构成程序的字母均取自字符集。
第1章 C++编程简介 2.9 本章小结 ◇ 字符集是构成C++程序语句的最小元素,程序的中除了字符串常量外,所有 构成程序的字母均取自字符集。 ◇ C++的基本数据类型包括布尔型、字符型、整数型、实数型、空值型。分别 用bool、char、int、float、void表示。其中float类型对有些带小数的实数只能 近似表示。各种数据类型都有自己的表示范围。 ◇ 在字符常量中,有些转义如\t,\n常用在输出流中用来控制输出格式。整数(常 量)的默认类型为int,实数(常量)的默认类型为double。 ◇ 给变量赋值的实质是将一个数放到变量名标识的内存单元中。在包含赋值运 算的运算符中,操作数必须是一个左值。 ◇ 文字常量、符号常量、常变量统称常量。 ◇ 各种运算符种类繁多,且具有不同的优先级与结合性,大致优先顺序为:一 元运算优先于二元运算;二元运算优先于三元运算;算术、移位、关系、按 位、逻辑运算的优先级依次降低。 ◇ 复杂的运算式要多使用括号以方便阅读与理解。 ◇ 在表达式中,参加运算的数据如果类型不同可以自动转换,自动转换的规律 是低类型向高类型转换,以不丢失数据,不降低精度为原则。 ◇ 除了自动类型转换外,C++提供了多种强制类型转换方法,供在特定的场合 使用。 ◇ 在含操作数计算次序不定的运算符的表达式中,避免在其操作数中引入带副 作用的运算符。带副作用的运算符有++、--、各类赋值运算符等。


Download ppt "C++语言程序设计教程 第2章 数据类型与表达式 第2章 数据类型与表达式 制作人:杨进才 沈显君."

Similar presentations


Ads by Google