1 / 59

第 2 章 数据类型、运算符与表达式

第 2 章 数据类型、运算符与表达式. 数据指能输入到计算机中,并能被计算机处理的对象,数据是 C++ 程序处理的基本单元。类型是对数据的一种抽象,不同类型的数据其表示方法、所占存储空间的大小及定义在其上的操作是不同的。 本章介绍: C++ 的数据类型 基本运算符 表达式语句和空语句. 2.1 C++ 的数据类型. C++ 语言的数据类型包括 基本数据类型、派生类型和类类型 。基本数据类型是系统预先定义的、可直接使用的数据类型;派生类型是从基本类型派生出的新类型;类类型是通过组合现存类型而生成的新类型。 C++ 的字符集:

ofira
Télécharger la présentation

第 2 章 数据类型、运算符与表达式

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第2章 数据类型、运算符与表达式 数据指能输入到计算机中,并能被计算机处理的对象,数据是C++程序处理的基本单元。类型是对数据的一种抽象,不同类型的数据其表示方法、所占存储空间的大小及定义在其上的操作是不同的。 本章介绍: • C++的数据类型 • 基本运算符 • 表达式语句和空语句

  2. 2.1 C++的数据类型 C++语言的数据类型包括基本数据类型、派生类型和类类型。基本数据类型是系统预先定义的、可直接使用的数据类型;派生类型是从基本类型派生出的新类型;类类型是通过组合现存类型而生成的新类型。 C++的字符集: (1)26个英文字母(C++中大写和小写表示两个不同的字符) (2)10个阿拉伯数字(0 - 9) (3)其它特殊符号(汉字是特殊符号) • 以运算符为主(+、-、*、/、=、!等) • 10个标点符号( ' 、 " 、(、)、{、}、,、:、;、…) • 分隔符(运算符、空格、标点符号、回车键、Tab键)

  3. 2.1.1 关键字 关键字(keyword)又称保留字,是系统预先定义的、具有特定含义的标识符。标准 C++中预定义了63个关键字。

  4. 2.1.2 标识符 标识符是由若干个字符组成的字符序列,用来命名程序中的一些实体。如常量名、变量名和函数名等。 • 标识符的书写规则: • 由字母(a~z,A~Z)、数字(0~9)或下划线(_)组成。 • 必须以字母或下划线开头。 例如:example1,My_Message,Mychar,thistime 非法:8key,b-milk,-home • 最多由247个字符组成。 • 在标识符中,严格区分大小写字母。 例如:book 和 Book 是两个不同的标识符。 • 关键字不能作为自定义的标识符,但是标识符中可包含关键字。 例如:int1, INT • 一个写得好的程序,标识符应该尽量有意义。

  5. 2.1.4 分隔符 分隔符用来分隔C++语言中的语法单位,表示前一语法实体的结束和另一个语法实体的开始。在不同的词法符号之间必须用分隔符隔开。 在C++中起分隔符作用的符号有:空格符、制表符、换行符、注解符、运算符和标点符号。

  6. 2.1.5 C++的基本数据类型 字符型 char 整型 int 基本数据类型 单精度型 float 双精度型 double 无值型 void 数据类型 数组型 结构型 导出数据类型 联合型 指针型 类类型 修饰符:signed, unsigned, long, short 可加在char 或 int 前

  7. 2.1.5 C++的基本数据类型 数据类型决定了数据所占存储空间的大小、存储方式及值的范围,这些可能与机器有关。 基本数据类型及其表示范围: Page 7

  8. 2.1.5 C++的基本数据类型

  9. 2.1.6 常量 常量是指在程序执行的整个过程中始终保持不变的量。常量分为:整型常量,字符型常量,浮点型常量和字符串常量。 • 整型常量 • 整型常量即整数,包括长整数 (long)、有符号整数 (int) 和无符号整数 (unsigned int)。C++中通过在整数后面加上一些特殊字符作为后缀来限定数据类型。 • - 后缀字符 u 或 U 表示无符号整数 • - 后缀字符l 或 L 表示长整数 • - 后缀 l 或 L 与 u 或 U 的组合表示无符号长整数

  10. 2.1.6 常量 整数有三种表示形式: • 十进制整数。除表示正负数的符号外,以 1~9 开头,由 0~9 组成的数。 例如:128 +234 -278 2002u 123uL 123lu • 八进制整数。以 0 开头,由 0~7 组成的数。 例如:0126 050000L 060002u。 • 十六进制整数。以 0X 或 0x 开头,由 0~9、A~F 或a~f 组成的数。 例如:0x12A 0x5a000L 0xF0002u 思考:09是哪种类型的整数? +07是合法的八进制整数吗?

  11. 2.1.6 常量 • 浮点型常量 • 浮点型常量即实数。包括单精度(float)数、双精度(double)数和长双精度(long double)数。 • 定点数表示法。由整数和小数两部分组成,中间用小数点隔开。可用后缀字符 f 或 F 来表示单精度数,l 或 L 表示长双精度数。 • 例如:2.718f 0.5 53.69L .45 55. -2.36 • 不加后缀修饰时,缺省为双精度数。 • 指数表示法 (科学记数法)。由尾数和指数组成,中间用E或e隔开。 • 例如:3.6E2 1e-10 指数表示法必须有尾数和指数两部分,并且指数只能是整数。 一个实型数,总是被假定为 double 型,除非有 F 或 f 后缀,才被处理为 float 型。若有 L 或 l 后缀,则被处理为 long double 型。

  12. 4 字节表示 float 数值: 4字节 符号位 8位指数 23位尾数 8 字节表示 double 数值: 8字节 …… 符号位 11位指数 52位尾数 2.1.6 常量

  13. 1字节 符号位 7位指数 2.1.6 常量 • 字符型常量 字符型常量包括普通字符常量和转义字符常量。 • 普通字符常量。用一对单引号将单个字符括起来构成。 例如:'a' 'A' '*' • 一个字符仅占用一个字节,存放该字符的ASCII码。 例如:a 的ASCII码为97, 二进制表示为 01 100 001。

  14. 转义字符 名称 \a 响铃 \b 退格 \f 换页 \n 换行 \r 回车 \t 水平制表 \v 纵向制表 \\ 反斜杠 \’ 单引号 \” 双引号 \000 八进制数 \xhh 十六进制数 \0 空字符 2.1.6 常量 • 转义字符常量。以’\’开头,后跟表示特殊含义的字符序列。可用于表示控制字符或特殊字符。 例如: '\n' '\'' '\\' '\141' '\x61' '\0'

  15. 2.1.6 常量 • 字符串常量 字符串常量是由一对双引号括起来的零个或多个字符序列。 例如:"This is a C++ Program.\n" "\td" " " "" "2002\12\22" "你好" • 字符串常量与字符常量的存储方式不同。每个字符串常量均以\0字符作为字符串结束标志。 例如: "Program","m"和 'm' 的存储方式如图示。 • 字符串常量和字符常量所能进行的运算不同。 例如:"m" + "n"是非法运算,而'm'+'n'是合法运算。

  16. 2.1.7 变量 变量是指在程序运行过程中可以修改的量。变量具有三个基本要素:变量名、变量的类型和变量的值。 • 变量名用标识符表示。标识了一个数据的存储空间。每个变量均由编译程序为其分配若干个字节的内存单元,以便保存该变量的值。 • 变量有唯一确定的数据类型。类型决定了变量的存储方式、取值范围及在其上可执行的操作。 • 变量应先定义,后使用。 • 变量只能定义一次。 • 变量应当先赋值,后使用。当要改变一个变量的值时,就把变量的新值写入为该变量所分配的内存单元中,称赋值;当使用一个变量的值时,就从该变量所标识的内存单元中读取数据,又称引用。一个变量如果未曾赋值,其值是不确定的。 • 给变量命名时,应该注意使用有意义的名字。以帮助描述变量所保存的值。最好使用小写字母。

  17. 2.1.7 变量 给变量赋初值 • 变量的说明 数据类型 变量名1[=初始值1], 变量名2[=初始值2], ...; 例如:int a; float a,b,c,d; int a=4, b=5; C++有效的数据类型,如:int、char、float、double、long 等 • 相同类型的变量可以放在一个说明语句中说明,变量名之间用逗号隔开。 • 变量可以在使用之前的任何地方说明。 • 在说明变量的同时给变量指定值称为变量的初始化。初始化时赋予变量的值的类型应与变量的类型一致。

  18. 2.1.7 变量 • const 型变量 const 型变量只能在说明变量时指定值,一旦初始化后就不允许再修改其值。 例如: const float e=2.71828f; //说明 const 型单精度变量 e const int n=2*10; //说明 const 型整数变量 n 下面的语句是错误的: const double pi; pi=3.1415926; const 型变量一般用于不需要修改变量值的场合。

  19. 2.1.7 变量 例2-1 阅读以下程序,给出运行结果。 #include <iostream.h> void main(void) { const int n=6; float x=5.26f; char ch1='m'; int count; count=n; cout<<"n="<<n<<endl; cout<<"x="<<x<<endl; cout<<"ch1="<<ch1<<endl; cout<<"count="<<count<<endl; } 执行以上程序后,在屏幕上输出的结果为: n=6 x=5.26 ch1=m count=6

  20. 2.2 基本运算符 运算符也称为操作符,是对程序中的数据进行运算的标志符号。参与运算的数据称为操作数或运算对象。 • 不同的运算符所完成的运算或操作不同。 • 不同的运算符操作数的个数、类型不同。根据运算符需要的操作数的个数,可将其分为三种: 单目运算符、双目运算符和三目运算符。 • 当不同的运算符混合运算时,运算顺序是根据运算符的优先级而定的,优先级高的运算符先运算,优先级低的运算符后运算。 • 在一个表达式中,如果各运算符有相同的优先级,运算顺序是从左向右,还是从右向左,是由运算符的结合性确定的。如果一个运算符对其运算对象的操作是从左向右进行的,就称此运算符是左结合的,反之称为右结合的。

  21. 2.2 基本运算符 C++语言的运算符很多,本节仅介绍基本运算符的使用。 表2-3列出了C++语言中的运算符及其功能。

  22. 2.2.1 基本运算符 C++ 的基本运算符包括算术运算符、赋值运算符、关系运算符、逻辑运算符、位运算符、逗号运算符和sizeof 运算符。 • 算术运算符 • C++语言提供了7个算术运算符:+ (正)、- (负)、+、-、*、/、%。 • / 运算符要求其右边的操作数不能为 0,其功能是计算两个操作数的商。当 / 运算符作用于两个整数时,进行整除运算。 • % 运算又称模运算,要求两个操作数必须是整数,其功能是求余数。

  23. 2.2.1 基本运算符 例如: 3.0/4 3/4 3%4 4%4 注意:余数的符号与左操作数的符号相同。 例如: 3%2=1 -3%2= -1 3%-2=1 -3%-2= -1 = 0.75 = 0 = 3 = 0

  24. 2.2.1 基本运算符 算术运算符的优先级为: 单目+、-高于 *、/、%高于 双目+、- • 对于同一优先级的运算符,则按照从左到右的顺序进行计算。可用括号 () 来改变运算符的优先顺序。 • 在 C++ 中进行算术运算时要注意的一个问题是计算过程中的溢出(超出了数据的表示范围)问题。除法运算时,除数为 0 或很小,整数加或乘运算时,操作数过大,都有可能导致溢出。 例如:(a1*a2*a3)/(b1*b2*b3) 与 a1/b1*a2/b2*a3/b3 结果可能不同。

  25. 2.2.1 基本运算符 • 赋值运算符 C++提供了两类赋值运算符,基本赋值运算符和复合赋值运算符。基本赋值运算符为“=”,复合赋值运算符有:+=、-=、*=、/=、%=、<<=、>>=、&=、^=、|=。 • 赋值运算符都是双目运算符,结合性都是右结合,即赋值表达式的运算顺序是从右向左进行的。例如: sum1=sum2=0 相当于 sum1=(sum2=0)。 • 赋值运算符左边的操作数必须是左值。例如: • x=3+5 // x 是左值 • x+3=5 // x+3 不是左值 • 当同一个变量出现在赋值运算符的两边时,可以用复合赋值运算符表示。复合赋值运算符是一个整体,中间不能用空格隔开。例如: • a=a+1 可以写成:a+=1 • a=a*b 可以写成:a*=b 赋值运算符的优先级较低,书写时,要注意避免容易误解的写法。例如: a*=b+c 等价于:a=a*(b+c) 可以写成:a*=(b+c)

  26. 2.2.1 基本运算符 • 赋值运算符的优先级是同级的。 例2-2 阅读以下程序,给出运行结果。 #include <iostream.h> void main(void) { int m,n,a=3,b=3,number; number=237; m=number/5; n=number%5; cout<<"m="<<m<<’\t’; cout<<"n="<<n<<endl; a+=m; b*=n; cout<<"a="<<a<<’\t’; cout<<"b="<<b<<endl; } 求余运算,n=2 整除运算,m=47 a=a+m =3+47=50 b=b*n =3*2=6 程序运行后,输出: m=47 n=2 a=50 b=6

  27. 2.2.1 基本运算符 • 关系运算符 • 关系运算符完成数据的比较运算。C++语言提供了6个关系运算符:<、<=、>、>=、==、!= 。 • 关系运算符都是双目运算符,用于比较两个操作数的大小、相等或不相等,其运算结果为 1 或 0。如果关系式成立则运算结果为逻辑真(用 1 表示),否则为逻辑假 (用0表示)。例如: • 3>5 • 3!=5 • 关系运算符的优先级为: • 算术运算符 高于 >、>=、<、<=高于 ==、!= • 关系运算的结果可作为一个整数参与表达式的运算。例如: • int i,a=1,b=10,x; • x = 5; • i = a<=x<=b;

  28. 2.2.1 基本运算符 #include <iostream.h> void main(void) { int a=2, b=3, c=4; cout << (a > 2) << endl; cout << (a < b+c) << endl; cout << (a == 3) << endl; cout << (a=3) << endl; cout << (a>'a') << endl; cout << (a='a') << endl; cout << (b=a==2) << endl; cout << ('a'>'A') << endl; cout << ('b'=='a'+1) << endl; cout << (a*=b) << endl; } 练习: 0 1 0 3 0 97 0 1 1 0

  29. 2.2.1 基本运算符 • 逻辑运算符 C++提供了三个逻辑运算符,用于表示操作数之间的逻辑关系。它们是:与 &&、或 || 、非 ! 。 • 逻辑非! 是单目运算符,对操作数进行取反运算。当操作数为非0 (逻辑真) 时,! 运算结果为 0;反之为 1。 • && 和 || 运算符是双目运算符。当两个操作数都是非0 (逻辑真)时,&&运算结果为1;否则为0。当两个操作数都是0 (逻辑假)时,|| 运算结果为0;否则为1。 • 逻辑运算的结果可作为一个整数再参与逻辑运算、关系运算或算术运算 。 • 逻辑运算符的运算优先级为: !高于 算术运算符 高于 关系运算符 高于 &&高于 ||。

  30. 2.2.1 基本运算符 例1:计算以下各式: !(3>5) 5>3 && 6>8 5>3 || 6>8 1 0 1 例2:当 c=4 时,以下各式的值是多少? (c=1)&&(c=3)&&(c=5) (c==1)||(c==2) || (c==5) (c!=2) && (c!=4) &&(c>=1)&&(c<=5) 1 0 0 • 注意:1<x<10 应表示为:1<x && x<10 • 当前面的表达式可以得出整个表达式的结果时,不必再求后面的表达式。例如: • a&&b&&c 当 a 为 0 时,表达式为 0,不必计算 b 与 c。 • a||b||c 当 a 为 1 时,表达式为 1,不必计算 b 与 c。

  31. 2.2.1 基本运算符 例2-3 阅读下列程序,给出运行结果。 #include <iostream.h> void main(void) { int width, height, result1, result2, result3; height=3; width=5; result1=height>3 && width>=5 ; result2=height>3 || width>=5; result3=!(width>=5); cout<<"result1="<<result1<<'\t'; cout<<"result2="<<result2<<'\t'; cout<<"result3="<<result3<<endl; } 程序运行后的结果为: result1=0 result2=1 result3=0

  32. 2.2.1 基本运算符 • 位运算符 • 位运算符是用来对二进制位进行运算的算符。位运算的操作数必须是整数。C++提供了两类位运算符,即按位逻辑运算和移位运算。按位逻辑运算符为:~、&、^、|;移位运算符为:<<、>>。 • (1)按位逻辑运算符 • 按位逻辑非“~”运算。单目运算符,对操作数进行逐位取反运算,若二进制位为0,则取反后为1;二进制位为1,则取反后为0。 • 按位逻辑与“&”运算。对两个操作数逐位进行运算,若对应位都为 1,则该位结果为 1,否则为 0。 • 按位逻辑或“|”运算。对两个操作数逐位进行运算,若对应位都为0,则该位结果为 0,否则为 1。 • 按位逻辑异或“^”运算。对两个操作数逐位进行运算,若对应位不相同,则该位结果为 1,否则为 0。

  33. 2.2.1 基本运算符 例如: short int a=0xc3 & 0x6e // 结果为 0x42 short int c=0x5a ^ 0x26 // 结果为 0x7c

  34. 2.2.1 基本运算符 (2)移位运算符 移位运算符是双目运算符,使用的格式为: operation1<<n 或 operation2>>m 其中,n 和 m 为整数。 • “<<”运算符是将操作数 operation1 向左移动 n 个二进制位。 例如: short int operation1=0x8, n=3; short int a=operation1<<n; 注意:操作数左移 n 个二进制位后,右边移出的空位用 0 补齐。 结果为 0x40 0 0 0

  35. 例如: short int operation2=0xa5, m=3; short int b=operation2>>m; // 结果为 0X14 • 操作数右移 m 个二进制位后,左边移出的空位用符号位补齐。 • 移位运算符并不改变 operation1 和 operation2 本身的值。 2.2.1 基本运算符 • “>>”运算符是将操作数 operation2 向右移动 m 个二进制位。 • 位运算符的运算优先级为: ~高于 <<、>>高于 &高于 ^高于 |。

  36. 2.2.1 基本运算符 例2-4 阅读下列程序,给出运行结果。 #include <iostream.h> void main(void) { short int hexx=0x1a, hexy=0x36; short int hexa, hexb, hexc, hexd; short int hexl, hexr; hexa=~hexx; hexb=hexx & hexy; hexc=hexx | hexy; hexd=hexx ^ hexy; hexl=hexx<<3; hexr=hexy>>3; cout<<"hexx="<<hex<<hexx<<"\t hexy="<<hex<<hexy<<’\t’; cout<<"hexa="<<hex<<hexa<<"\n hexb="<<hex<<hexb<<’\t’; cout<<"hexc="<<hex<<hexc<<"\t hexd="<<hex<<hexd<<endl; } 程序运行后,输出: hexx=1a hexy=36 hexa=ffe5 hexb=12 hexc=3e hexd=2c 按位逻辑异或

  37. 2.2.1 基本运算符 • 逗号运算符 表达式1,表达式2,表达式3,…,表达式n 顺序计算各表达式的值,运算结果为最后一个表达式的值。逗号运算符的优先级最低。例如: int a, b, c; a=(3+4, 5*6, 2+1); b=3+6, b*3, b+6 • sizeof 运算符 sizeof(类型) 或 sizeof(表达式) 用于测试数据类型或表达式类型在内存中所占的字节数。例如: sizeof (int) // 整数类型四个字节,结果为 4 sizeof (3+3.6) // 3+3.6 的结果为 double 类型,结果为 8 a=3 b=9 第二个表达式的值是 15

  38. 2.2.2 表达式 由运算符和操作数组成的符合语法规则的序列称为表达式,表达式经运算后得到一个结果值。操作数可以是常量、变量等。 按运算符的不同可将表达式分为算术表达式、赋值表达式、关系表达式、逻辑表达式和逗号表达式。 按表达式能放在赋值号的左边还是右边可将表达式分为左值表达式和右值表达式。 表达式按照一定的运算顺序来求值,其运算顺序由表达式中运算符的优先级决定。 每个表达式都有确定的运算结果(表达式的值)和数据类型(值的类型)。

  39. 2.2.2 表达式 • 左值表达式和右值表达式 在C++中,把能放在赋值号左边的表达式称为左值表达式,简称左值 (lvalue),左值表达式指定了一个存放数据的空间;把能放在赋值号右边的表达式称为右值表达式,简称右值 (rvalue)。 例如: 右值表达式 int bottom,midx; bottom; bottom+3; 5; int const top=19; //说明 const 变量 top top; midx=bottom; 左值表达式可以作为右值表达式,但右值表达式不一定能作为左值表达式。 5是常量,是右值表达式 top不能修改,是右值表达式

  40. 2.2.2 表达式 • 算术表达式 由算术运算符、位操作运算符和操作数组成的符合语法规则的序列称为算术表达式,算术表达式的值为整型或实型。 除法运算符“/”的两个操作数都是整数时,运算结果为一个整数,否则为一个浮点数。模运算符“%”要求两个操作数必须是整数,结果为余数。 #include <iostream.h> void main(void) { int a=0; float b; b=a=2.5; cout << a <<endl; cout << b <<endl; } 表达式求值时,表达式中的每一个变量都必须有一个确定值。复杂的表达式中可增加括号,明确地规定表达式的求值顺序。 • 赋值表达式 由赋值运算符和操作数组成的符合语法规则的序列称为赋值表达式。赋值表达式要求赋值运算符“=”左边必须是左值,其功能是用右值修改左值。 赋值表达式的计算顺序是从右向左进行的,运算结果是左值。

  41. 2.2.2 表达式 注意: (1)赋值表达式是左值。例如: (x=5)=23+6 // x=5是左值,x 和整个表达式的值为 29 x=y=z=0 // 先使 z=0,然后再将 z 的值赋给 y (2)说明语句中的 “=”为初始化符号,与赋值运算符含义不同。 float radius=5.63f; // 说明变量 radius,并初始化为 5. 63 int sum1=total1=0; // 语法错误 radius=5.63f; // 给变量 radius 赋值 (3)赋值表达式的值类型为左值的类型。例如: int mnt; mnt=2.9+6 // 先计算 2.9+6 的值 8.9,将整数 8 赋给左值 mnt,表达式的值为 8

  42. 2.2.2 表达式 • 关系表达式 由关系运算符和操作数组成的符合语法规则的序列称为关系表达式。关系表达式的结果为逻辑值,即表达式中的关系成立时,其值为逻辑真(用1表示),否则其值为逻辑假(用0表示)。 关系表达式通常用来构造简单的条件表达式,用在程序流程控制语句中。例如: if (x>0) y = x; else y = - x; 关系运算符“==”用来比较两个操作数是否相等。若两个操作数相等,结果为1;否则结果为0。“=”和“==”是两个完全不同含义的运算符,注意不要误写。例如 : (1)if (x==168) … (2)if (x=168) … 单从语法上看,上面两个程序段都没有语法错误。因此,一旦将“==”误写成“=”,编译器不会指出语法错误。 判断x是否等于168,条件可能成,也可能不成立 将值168赋给 x,条件永远成立

  43. 2.2.2 表达式 • 逻辑表达式 由逻辑运算符和操作数组成的符合语法规则的序列称为逻辑表达式。逻辑表达式的运算结果为逻辑值,一般用来构造比较复杂的条件表达式。例如: age<=28 && pay<600 || age>28 && pay<800 在逻辑与和逻辑或运算符运算期间,一旦能确定表达式的值时,则结束计算。即: (1)在计算 <operation1> && <operation2> 时,首先计算操作数 operation1 的值,若其值为逻辑真 (非0),则计算 operation2 的值,并将 operation2 的逻辑值作为整个表达式的值;若 operation1 的值为逻辑假 (值为0),则不计算 operation2 的值,结束整个表达式的计算,结果为 0。例如: width<=12 && (height+=8)

  44. 2.2.2 表达式 (2)在计算 <operation1> || <operation2> 时,首先计算操作数 operation1 的值,若其值为逻辑假 (值为0),则计算 operation2 的值,并将 operation2 的逻辑值作为整个表达式的值;若 operation1 的值为逻辑真 (非0),则不计算 operation2 的值,结束整个表达式的计算,结果为1。 例2-6 阅读下列程序,给出运行结果。 #include <iostream.h> void main(void) { int x=20, y=10, z=30, p, q; p=!x&&y<20; q=x<10||y++>20; cout<<"p="<<p<<’\t’; cout<<"q="<<q<<endl; } 程序运行后,输出结果为: p=0 q=0

  45. 2.2.2 表达式 • 逗号表达式 由逗号运算符和操作数组成的符合语法规则的序列称为逗号表达式。语法格式为: <e1>, <e2>, <e3>, … , <en> 逗号表达式也称顺序求值表达式,按从左向右的顺序逐个求出表达式 e1, e2, e3, … , en 的值,并将 en 的值作为整个逗号表达式的值,en 的数据类型作为整个逗号表达式的类型。例如: int p, w, x=8, y=10, z=12; w=(x++, y, z+3)-5; p=x+5, y+x, z; 当逗号运算符的右操作数是一个左值时,则该逗号运算的结果也为左值。例如: (p=x+5, y+x, z)=2 逗号运算符的运算优先级最低。 w 的值为(z+3)-5 =10 p = x+5 = 14 z 的值 12 作为整个逗号表达式的值

  46. 2.2.3 混合运算和赋值时的类型转换 • 自动转换 整型、实型、字符型数据间可以混合运算。在运算时,不同类型的数据要先转换成同一类型的数据再进行运算。这种自动转换的功能也称为隐式转换。 转换规则是将低精度类型的数据转换为高精度类型的数据,因此在数据转换过程中,数据的精度不会损失。 当参与运算的两个操作数类型不可直接相互转换时,两者均向更高精度的类型转换。 由于字符是作为一个整数 (其ASCII编码值) 来存放的,故字符也可以作为一个整数参与数值运算。 例如:10+'a'+1.5-87.65*'b'

  47. 2.2.3 混合运算和赋值时的类型转换 图2-2 不同数据类型的自动转换规则

  48. 2.2.3 混合运算和赋值时的类型转换 • 强制转换 C++中允许将某种类型的数据强制性地转换为另一种指定的数据类型,语法格式为: (<数据类型>) <表达式>; 或者 <数据类型> (<表达式>); 其功能是将表达式的值强制转换为指定的数据类型,强制转换也称为显式转换。例如: int a=5, b=2; double d; d=a/b; // d = 2.0 d=(double)a/b; // d = 2.5 d=float(a/b)*2; // d = 4.0

  49. 2.2.3 混合运算和赋值时的类型转换 (1)强制转换是一种不安全的转换。将高精度类型的数据转换为低精度类型的数据时,数据精度会降低。 (2)强制类型运算后原变量的类型和值不变,但得到一个所需类型的中间变量。 在计算表达式时,对于系统能够自动转换的数据类型,没有必要进行强制类型转换。仅在系统不作强制类型转换会影响表达式求值的精度或不能完成相应的运算时,才要使用强制类型转换。

  50. 2.2.3 混合运算和赋值时的类型转换 • 赋值时的类型转换 • 若" = " 两边变量类型不同,在赋值时要进行类型转换。 • 转换原则:根据左边变量的类型转换。 • 将实型数赋给整型变量时,去掉小数部分,仅取其整数部分赋给整型变量。 • 将整型数赋给实型变量时,将整数变换成实型数后,再赋给实型变量。 • 字符型数据赋给整型变量,分两种情况: • 无符号型的字符变量,低八位不变,高位补0后赋值; • 有符号型的字符变量,若符号位为 0,与无符号型的转换规则相同;若符号位为 1,将高位全部置 1 后再赋值。 • 将实型数赋给整型、无符号(长)整型赋给整型变量(即高精度赋给低精度)时,若超出取值范围,赋值的结果错误。

More Related