C++课件 运算符与表达式

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例如:(float)a ; 将变量a的值强迫转换为单精度数据 类型。
(int)(x+y); 将(x+y)的值强迫转换为整数类型。
注意:1)在强制类型转换中,产生一个中间变量,用于存 放其转换后的数值;原变量(表达式)的数据类型不变。
2)系统提供的数学函数一般要求参数为double型, 在调用这些函数时,就可使用强制类型转换的方法。
/* 65ABH=26027D */
输出:a=26039
• 输出转换 以%d输出long型数据,相当于将long型转换为int型再输出。 %u相当于将int型按无符号方式输出。
注意:1)负数转换为无符号数时,符号位作为数值的一部分。
2)以较短类型输出较长类型数据时,高位丢失, 若数据超出短类型范围,将产生较大误差。 实数转换为整数时,仍然会产生这类错误。
目的:扩展短类型的数据,使运算符两端具有相同的类型。
原则:

double
float
long
unsigned

int
char,short
例: 50L + 5 * ’a’ - 30.0
long int char float
① int
②long
double
③double
强制类型转换(显式转换) 强迫表达式的值转换为指定的数据类型。其一般格式为: (类型标识符)表达式;
第 3 讲 运算符与表达式 数据类型的转换
目的、要求
掌握运算符、表达式、优先级、结合 性等概念; 掌握赋值表达式、逗号表达式; 掌握数据类型的转换。

3.1 运算符与表达式
13 类运算符 算术运算符:+,-,*,/,%,++,-关系运算符:>,<,>=,<=,==,!= 逻辑运算符:!,&&,|| 位运算符:<<,>>,~,|,^,& 赋值运算符:= 条件运算符:? : 逗号运算符:, 指针运算符:*,& 求字节数运算符:sizeof
• 零扩展:将unsigned型扩展为较长的整型数时,增加的位全部 置0。 • 最高位符号功能的丢失与形成:
1 0000000 丢失
1 0000000
00000000 形成
00000000
signed型 unsigned型
• 实数转换为整数(范围不越界)时,小数部分全部舍去。
• double型转换为float型时,按“四舍五入”去除多余的有效 数字。
3)自反算术赋值运算符(复合的赋值运算符) 赋值运算符前加上其它的运算符构成。 使用复合运算符的目的:简化程序和提高编译效率 -=:自反减赋值 +=:自反加赋值 *=:自反乘赋值 /=:自反除赋值 %=:自反模赋值
c=b*=a+2
a+=3 x*=y+8 x%=3
等价
a=a+3 x=x*(y+8) x=x%3
• 强制类型转换运算符:类型 • 分量运算符:.,-> • 下标运算符:[ ] • 其它:如函数调用运算符()
运算符与运算量的关系 • i目运算符:要求i个运算量参加运算。 • 运算量的类型:%要求两个运算量均为整型。 • 运算的优先级: • 运算的结合方向: • 运算结果的类型:即表达式值的类型。
则赋值后 a=0。
5)long int变量=unsigned int数据,无符号扩展,高位 补0即可。
6)将非unsigned型数据赋给长度相同的unsigned型变 量时,连同符号位原样传送。
3. 复合的赋值运算符 复合运算符:在赋值运算符前加上其它的运算符构成。
复合运算符的目的:简化程序和提高编译效率。
(4,3)。
5)正/负号运算符
优先级:高于*、/ 运算符。 结合方向:自右至左。
赋值运算符的结合方向均为自 右至左。
• 6)编程注意事项 • 可靠性第一,效率第二。 • 分解费解的语句; • 适当增加一些括号; • 加注释说明 • 分解表达式,提高程序的可移植性。
3.2 赋值运算符和赋值表达式
4)自加/自减运算 i++:先使用,后自加。 i--:先使用,后自减。 ++i:先自加,后使用。 --i:先自减,后使用。
结合方向:自右至左。 运算对象:整型变量。
• 何时进行自加自减,举例说明如下(若i=3): — K=i++;执行后K=3,i=4。 — K= (i++)+( i++)+( i++);执行后K=9,i=6。 过程为:(1)取出i的原值3相加,得K=9; (2)i进行三次自加,得i=6。 — K= (++i)+( ++i)+( ++i);执行后K=18, i=6。
3.3 逗号运算符和逗号表达式
逗号表达式:用逗号运算符连接的表达式。
一般形式为:表达式1,表达式2(,…,表达式n)
求解过程为:先求表达式1,再求表达式2,表达式2的 值(或表达式n的值)为整个逗号表达式的值。
逗号运算符的优先级是所有运算符中级别最低的。例:
x=(a=3,6*3)
赋值表达式,x=18
x=a=3,6*a
逗号表达式,x=3
printf(“%d,%d,%d”,a,b,c); “a,b,c”为函数的3个参数,逗号为参数间
的分隔符。
printf(“%d,%d,%d”,(a,b,c),b,c); “( a,b,c )”为逗号表达式,其值等于c的值。
1. 几个概念 • 提升:由低级的数据类型转换为高级的数据类型。 • 降格:由高级的数据类型转换为低级的数据类型。 • 同一长度的整型数带/不带符号的转换属于同一级别。 • 符号位的扩展:将signed整型数提升为较长的signed型,在增 加的长度中各个位的状态与原来较短的数据中的符号位相同。
a+=3
a=a+3
x*=y+8
等价
x=x*(y+8)
x%=3
x=x%3
Fra Baidu bibliotek 4. 赋值表达式 赋值表达式:由赋值运算符将一个变量和一个表达
式连接起来的式子。
一般形式:<变量><赋值运算符><表达式> 其中,表达式又可以是一个赋值表达式,并可以包
含复合的赋值运算符。如:
a=(b=5)
a+=a-=a*a 赋值运算符的结合顺序为:自右而左。
• 系统将字符处理为带符号的量时:
字符最高位为0,处理方法同上; 字符最高位为1,则int变量的高8位全补1(又称为字符扩展)。
4)long int变量=int数据,同3)进行字符扩展。 int变量=long int数据,只截取long int数据的低16位原封
不动的送到int变量。如: int a; long int b=65536; a=b;
1. “=”为赋值符号。 2. “=”两侧类型不一致时的转换:
1)整型变量=实型数据,舍去小数部分。 2)float变量=int数据,将int数据转换为float型。
double变量=int数据,将int数据转换为double型。 3)int变量=c型数据,因int型为2字节,c型为1字节, 分下列两种情况: • 系统将字符处理为无符号量,则字符数据(8位)放到int 变量的低8位。
• 自加是在整个表达式求解一开始时最先进行的, 故先对i进行三次自加得i=6,然后再进行 K=6+6+6的运算。
• C编译处理时,尽可能多的自左而右将若干个 字符组成一个运算符,如:i+++j相当于(i++) +j。

• 上机实验:
• printf(“%d,%d”,i,i++);
• 视不同的系统分别输出答案(3,3)或
• 舍去小数与四舍五入有可能丢失精度。
• 浮点数降格,即:
double
float 或
double(float)
long、short
若数值超过了目标类型的取值范围,所得结果不确定。
• 较长的整型转换为较短的整型时,截去高位,保留低字节内 容。因而会产生较大误差。
2. 不同类型数据的转换 • 算术转换(运算符转换)
赋值表达式可出现在算术表达式中: 3+(a=5)*6
1. 算术运算
1) 整数相除舍去小数部分,如:
5/3=1 但有一个数为负数时,舍入方向视不同的系统而定。
-5/3=-2 -5/3=-1
(少数系统) (多数系统)
注意:模运算符“%”要求其两侧均为整型数据。
2) 若有一个数为实数,则结果为double型 (因所有实数都按double型进行运算)。
赋值表达式中类型的转换:
其一般格式为:变量名= 表达式;
转换规则:“=”右边的值被转换为“=”左边变量所属的 类型。
若右边的数据类型级别较高(数据位较长),则进行截断 或取舍。
例如:int a;
float b=12.00;
long c=64578987; /* 3D965AB */
a=b+c;
相关文档
最新文档