170 likes | 285 Views
本章内容. 表达式概念 算数运算符 ++,-- 运算符 赋值运算符 逗号运算符 关系运算符 逻辑运算符. 条件运算符 位运算 复合运算 混合运算 类型运算符 运算符优先级表 常用数学函数. 表达式. 概念:常量、变量、数组元素、函数等运算对象和运算符号以及括号的有意义的组合 , 都被成为表达式 , 也就是说表达式是一个运算的式子 (P30), 如下面都是表达式 2 a 2+a a++ 2+sin(5) a=2 a,b. 算数运算符.
E N D
本章内容 • 表达式概念 • 算数运算符 • ++,--运算符 • 赋值运算符 • 逗号运算符 • 关系运算符 • 逻辑运算符 条件运算符 位运算 复合运算 混合运算 类型运算符 运算符优先级表 常用数学函数
表达式 • 概念:常量、变量、数组元素、函数等运算对象和运算符号以及括号的有意义的组合,都被成为表达式,也就是说表达式是一个运算的式子(P30),如下面都是表达式 • 2 a 2+a a++ 2+sin(5) a=2 a,b
算数运算符 • + (加) -(减) *(乘) / (除) %(求余) • 注意写C语言表达式时和数学中的算式相区分,下面数学算式都不是正确的C语言算式: • x/-y(出现两个运算符) (x+y)(a+b)(缺乏乘号) • 注意C语言中,同种类型值运算时结果为同类型,整数除整数结果为一个整数,如5/2 值为2,不是2.5 • 求余运算要求两个预算值皆为整数,结果为两者整除后产生的余数,如5%2 值为1,4%2值为0 • */%优先级高于+-优先级,运算方向从左向右
++,-- • ++--对应于低级语言中的自增和自减运算,运算只能用于变量,使变量自增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
++ --运算符举例 • //例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; • }
赋值运算 • 在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; • }
逗号运算符 • 格式: 表达式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
关系运算 • 关系运算结果只能为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,永真式)
逻辑运算 • && (与运算):表达式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) • 三个运算符中,!为单目运算符,优先级最高,&&比||优先级高 • 逻辑运算方向,同级别从左向右,确定结果后停止运算
逻辑运算举例 • #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; • }
条件运算符 • 表达式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)
位运算 • 位运算是对操作数二进制位的运算 • &(按位与)、|(按位或)、^(按位异或) 、~(按位取反) • <<(算术左移)低位补零 • >>(算数右移)高位补符号位数字
复合运算 • C语言中,把一些运算符和=组合起来,同时完成运算符所指的运算及赋值预算,称为复合运算 • +=、-=、*=、/=、%=、&=、|=、^=、<<=、>>= • a+=b 相当于a=a+b • 复合运算符优先级等同于赋值运算符 • a=2; a*=2+3; • 因为*=优先级低于+,所以表达式值为10
混合运算 当不同数据类型进行运算时,称为混合运算 运算规律:不同数据类型相遇时,低类型产生一个向高类型的转化值(操作数本身不变化),然后参与运算,这条规则不适应赋值运算 例子: 5/2+3.5 结果为5.5 char a=‘\xff’; a*10*’a’;结果-970
强制类型转换 用类型符号把表达式值转换为指定类型 格式:(类型名)表达式 如: (int)(a+b),(float)c; 注意只影响结果,不影响操作数
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