本章内容

17
本本本本 本本本本本 本本本本本 ++,-- 本本本 本本本本本 本本本本本 • 本本本本本 • 本本本本本 本本本本本 本本本 本本本本 本本本本 本本本本本 本本本本本本本 本本本本本本

Upload: uriah-wright

Post on 31-Dec-2015

32 views

Category:

Documents


5 download

DESCRIPTION

本章内容. 表达式概念 算数运算符 ++,-- 运算符 赋值运算符 逗号运算符 关系运算符 逻辑运算符. 条件运算符 位运算 复合运算 混合运算 类型运算符 运算符优先级表 常用数学函数. 表达式. 概念:常量、变量、数组元素、函数等运算对象和运算符号以及括号的有意义的组合 , 都被成为表达式 , 也就是说表达式是一个运算的式子 (P30), 如下面都是表达式 2 a 2+a a++ 2+sin(5) a=2 a,b. 算数运算符. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 本章内容

本章内容

• 表达式概念• 算数运算符• ++,--运算符• 赋值运算符• 逗号运算符• 关系运算符• 逻辑运算符

条件运算符位运算复合运算混合运算类型运算符运算符优先级表常用数学函数

Page 2: 本章内容

表达式• 概念:常量、变量、数组元素、函数等

运算对象和运算符号以及括号的有意义的组合 , 都被成为表达式 , 也就是说表达式是一个运算的式子 (P30), 如下面都是表达式

• 2 a 2+a a++ 2+sin(5) a=2 a,b

Page 3: 本章内容

算数运算符• + ( 加 ) -( 减 ) *( 乘 ) / ( 除 ) %( 求余 )• 注意写 C 语言表达式时和数学中的算式相区分 ,

下面数学算式都不是正确的 C 语言算式 :– x/-y( 出现两个运算符 ) (x+y)(a+b)( 缺乏乘号 )

• 注意 C 语言中 , 同种类型值运算时结果为同类型 , 整数除整数结果为一个整数 , 如 5/2 值为2, 不是 2.5

• 求余运算要求两个预算值皆为整数 , 结果为两者整除后产生的余数 , 如 5%2 值为 1,4%2 值为0

• */% 优先级高于 +- 优先级 , 运算方向从左向右

Page 4: 本章内容

++,--

• ++ -- 对应于低级语言中的自增和自减运算 , 运算只能用于变量,使变量自增 1 或减 1, 不能用于表达式或常量 , 下面都是错的– 3++ (x+y)—

• ++ -- 运算符用在变量前时 , 先执行加 1 或减 1 运算 , 然后再把变量的值作为表达式值送出

• ++ -- 运算符用在变量后时 , 先把变量的值作为表达式值送出 , 然后再执行加 1 或减 1 运算

• 如 :• i=1;a=i++;//a 获得值为 1,i 自身变为2• i=1;a=++i; //i 自身变为2 , a 获得值为 2

Page 5: 本章内容

++ -- 运算符举例• // 例1

– #include "iostream.h"– void main(){– int a=1,b,c;– b=a++;– c=b++;– cout<<"a="<<a<<",b="<<b<<",c="<<c<<endl;– }

// 例 2#include "iostream.h"void main(){ int a=1,b,c;

b=a++; c=++a; cout<<"a="<<a<<",b="<<b<<",c="<<c<<endl;

}

Page 6: 本章内容

赋值运算• 在 C 语言中 ,= 也是一个运算符 , 它的左侧必须是一个变量 , 功能是把右

侧表达式的值赋给左侧的变量 , 并把此值作为 = 表达式的值 , 试比较 : – a=(a1+a2); + 是运算符 ,+ 表达式产生的结果即 (a1 加 a2 的和 ) 赋给了 a, b=(b1

=b2);= 是运算符 , 括号内的 = 使 b1 获得 b2 的值 , 同时 = 表达式产生的结果即(b2) 赋给了 b

– 当然括号外的 = 也产生表达式值 , 但此值没有保存到变量中• 赋值运算符优先级仅高于”,”运算符 , 方向从右向左• 当 = 两侧类型不一致时,右侧自动转化成左侧类型

– 低类型向高类型转化时会自动扩展字节 , 而值不变,扩充对于整数类 , 扩充字节填充符号位数字 , 正数填 0 ,负数填 1

– 高类型向低类型转化时 , 只从低字节截取• #include "iostream.h"• void main(){• short a=0x12345678;• cout<<hex<<a<<endl;• }

Page 7: 本章内容

逗号运算符• 格式 : 表达式 1, 表达式 2• 逗号运算符返回逗号右侧表达式值作为逗号表

达式值• 逗号运算符在所有优先级别最低,运算方向方

向从左向右• 下面表达式的值及 a 变量的值 :

– a=(5+4,c=6,d=7)// 表达式值为 7,a 的值为 7– a=5+4,c=6,d=7 // 表达式值为 7,a 的值为 9– a=(a=3*5,(a*4,a+5)),a+10 // 表达式值为 30,a 的值为

20

Page 8: 本章内容

关系运算• 关系运算结果只能为 1( 表示真或正确 ) 或 0( 表示假或错误 )• 高优先级 : < <= > >=• 低优先级 : == !=

– 例 :2>2( 值为 0) 2>=2( 值为 1)• 运算方向为从左向右运算 , 如 :

– 30==60==0 结果为 1– 10<5<20 结果为 1– 由此可以看出 , 这样连续比较是没有意义的

• 注意判断相等的关系运算符为相临的两个等号 , 一旦漏掉一个就变成了赋值运算– 如假设 a=0; 则表达式 a==0( 表达式值为 1),a==1( 表达式值为 0)– 而不管 a 值是多少 ,a=0( 表达式值永为 0, 永假式 ),a=1( 表达式值永为

1, 永真式 )

Page 9: 本章内容

逻辑运算• && ( 与运算 ): 表达式 1 && 表达式 2

– 相当于中文”并且” , 两个表达式全是 1, 则结果为 1, 否则结果为 0– 1&&1( 值为 1) 1&&0( 值为 0) 0 &&0( 值为 0)

• ||( 或运算 ): 表达式 1 || 表达式 2– 相当于中文”或” ||, 两个表达式全是 0, 则结果为 0, 否则结果为 1– 1||1( 值为 1) 1||0( 值为 1) 0 ||0( 值为 0)

• ! ( 否运算 ):! 表达式– 表达式值取反 ,0 变 1,1 变 0– !1( 值为 0) !0( 值为 1)

• 在逻辑运算中 , 所有的非 0 值都等同于 1 ,如:– 6&&1( 值为 1) !6( 值为 0)

• 三个运算符中 ,! 为单目运算符 , 优先级最高 ,&& 比 || 优先级高• 逻辑运算方向 , 同级别从左向右,确定结果后停止运算

Page 10: 本章内容

逻辑运算举例• #include "iostream.h"• void main()• { int a,b,c;• a=5;b=2;c=3;• a=a++||++b&&c++; cout<<"a="<<a<<"b="<<b

<<"c="<<c<<endl;• b=a>c&&c++||a++&&c++||a++ ; cout<<"a="<

<a<<"b="<<b<<"c="<<c<<endl;• }

Page 11: 本章内容

条件运算符• 表达式 1? 表达式 2: 表达式 3• 当表达式 1 的值为非 0 值时 , 表达式的值作为

表达式值 , 否则表达式 3 的值作为表达式值– a=-1;b=a>0?10:20;//b 的值为 20

– a=1;b=a>0?’A’:’B’;//b 的值为’ A’

• 优先级仅高于逗号运算符和赋值运算符,运算方向具有右结合性 , 如:– a>b?c:d<3?e:f, 等同于 a>b?c: ( d<3?e:f)

Page 12: 本章内容

位运算• 位运算是对操作数二进制位的运算• & (按位与)、 | (按位或)、 ^ (按位异或) 、 ~

(按位取反)• <<( 算术左移)低位补零• >>( 算数右移 ) 高位补符号位数字

表达式 值 表达式 值

5&7(101B&111B=101B) 5 5^7 2

5&&7 1 ~5 -6

5|7 7 5<<1 10

5>>1 2 -2<<1 -4

Page 13: 本章内容

复合运算• C 语言中 , 把一些运算符和 = 组合起来 , 同时完

成运算符所指的运算及赋值预算 , 称为复合运算

• +=、 -=、 *=、 /=、%=、&=、 |=、 ^=、<<=、 >>=

• a+=b 相当于 a=a+b• 复合运算符优先级等同于赋值运算符

– a=2; a*=2+3;

– 因为 *= 优先级低于 + ,所以表达式值为 10

Page 14: 本章内容

混合运算当不同数据类型进行运算时,称为混合运算运算规律:不同数据类型相遇时,低类型产生一

个向高类型的转化值 ( 操作数本身不变化 ) ,然后参与运算,这条规则不适应赋值运算

例子:5/2+3.5 结果为 5.5

char a=‘\xff’; a*10*’a’; 结果 -970

Page 15: 本章内容

强制类型转换

用类型符号把表达式值转换为指定类型格式 :( 类型名 ) 表达式

如: (int)(a+b),(float)c;

注意只影响结果,不影响操作数

Page 16: 本章内容

运算符优先级归类 运算符 结合方向元素 ( ) [] -> . 自左向右单目运算符 ! ~ ++ -- - (type) * & sizeof 自右向左算数运算符 * / % 自左向右

+ - 自左向右移位运算符 << >> 自左向右关系运算符 < <= >= > 自左向右

== != 自左向右位逻辑运算符 & | ^ 自左向右逻辑运算符 && 自左向右

|| 自左向右条件运算符 ? : 自右向左赋值运算符 = += -= *= /= %= &= |= <<= >>= 自右向左逗号运算符 , 自左向右

Page 17: 本章内容

math.h 中提供的数学函数( P29 )

• double fabs(double d) 求绝对值• int abs(int n) 求绝对值• double sqrt(double d) 求开平方值• double sin(double a) 求正弦值• double cos(double a) 求余弦值• double tan(double a) 求正切值• double exp(int n) 求 en • double log(double d) 求 ln(d)• double log10(double d) 求 log10(d)• double pow(double x,int n) 求 Xn