程序中相当一部分数据处理和“
语句
”是通过“
表达式
”表达的,其中使用各种“
运算符
”。
◆ 运算符的“ 优先级 ”指不同运算符在运算中的优先关系,可用序号表示,序号越小,优先级越高。比如:
加号“+”和减号“-”的优先级是6;乘号“*”和除号“/”的优先级是5.“*”和“/”的优先级高于“+”和“-”符合数学运算的规律。
◆ 运算符的“ 结合性 ”决定同优先级的运算符对操作数的运算次序。从左到右运算称为“右结合”,反之,从右到左称为“左结合”。
比如,+、-的结合性是从左到右(右结合),则a+b+c-d的运算次序为:
((a+b)+c)-d //先算a+b,再加c,最后减d
又如,前置++和单目负-的结合性是从右到左(左结合),则-++a的运算次序为:
-(++a) //先做++a,再取相反数(加负号)
同一优先级的运算符有相同的结合性。
按照要求的操作数个数,运算符分为单目(一元)运算符、双目(二元)运算符和三目(三元)运算符:
运算符与操作数是相关联的,相同的运算符对不同类型的操作数所执行的运算是有差异的。
◆ 1、算术运算符及其表达式
注意:
◆ 2、赋值运算符与赋值表达式
注意:赋值号不是等号,它具有方向性。“左值”必须放在内存中可以访问且可以合法修改值的存储单元,通常只能是变量名;“右值”则可以是常量,也可以是变量或表达式,但一定能取得确定的值。
例如:下面的赋值运算是错误的:
3.1415926=pi; //左值不能是常数
x+y=z; //左值不能是表达式
设:const int N=30;
则:N=40; //左值不能是常变量
◆ 3、自增、自减运算
◆ 4、逻辑运算、逻辑表达式和逻辑表达式的求值优化
下面是几个实例:
例1:假定a=3, b=0,c=5,d=2,x=6,y=2; 试分析下面的关系表达式::
a>b>c //先求a>b,结果为true,即1,再将结果1与c比较,结果为假
a+b>c+d //等同于(a+b)>(c+d),结果为假
a>b&&a<c||(x>y)-!a
//相当于((a>b)&&(a<c))|| ((x>y)-(!a)),结果为true
例2:假定a=2, b=0, c=3; 则逻辑表达式 a||b++||c-- 产生的结果是:
【分析】:a=2,第一个操作数为1;1与任何值相或的结果总是1(true);所以不用再计算b++和c--,则此b的值仍为0,c的值仍为3;整个表达式的值为1。
例3:假定x=0, y=2, z=3; 求表达式 x&&(y=y*y)&&(z=z+3)的结果?【解答】
◆ 5、位运算
◆ 6、逗号运算符与逗号表达式
例如:假定a=1,b=2,c=3; 以下逗号表达式的结果是:
c=b=(a=3,4*3) //结果为:a=3,b=12,c=12,表达式的值为12
c=b=a=3,4*3 //结果为:a=3,b=3,c=3,表达式的值为12
c=(b=a=3,4*3) //结果为:a=3,b=3,c=12,表达式的值为12
◆ 7、sizeof( )运算符
sizeof运算符:用于计算存储一种数据类型或一个变量所需的字节数。一般格式为:
sizeof (<数据类型>) 或 sizeof(<变量名>)
关于sizeof()的几点说明:
sizeof()应用举例:
sizeof(int); //值为4
sizeof( float); //值为4
设:double x;
则:sizeof(x); //值为8
C++的运算符、优先级和结合性
◆ 在C++中对常量或变量进行运算或处理的符号称为“ 运算符 ”;参与运算的数称为“ 操作数 ”。◆ 运算符的“ 优先级 ”指不同运算符在运算中的优先关系,可用序号表示,序号越小,优先级越高。比如:
加号“+”和减号“-”的优先级是6;乘号“*”和除号“/”的优先级是5.“*”和“/”的优先级高于“+”和“-”符合数学运算的规律。
◆ 运算符的“ 结合性 ”决定同优先级的运算符对操作数的运算次序。从左到右运算称为“右结合”,反之,从右到左称为“左结合”。
比如,+、-的结合性是从左到右(右结合),则a+b+c-d的运算次序为:
((a+b)+c)-d //先算a+b,再加c,最后减d
又如,前置++和单目负-的结合性是从右到左(左结合),则-++a的运算次序为:
-(++a) //先做++a,再取相反数(加负号)
同一优先级的运算符有相同的结合性。
按照要求的操作数个数,运算符分为单目(一元)运算符、双目(二元)运算符和三目(三元)运算符:
- 单目运算符只对一个操作数运算,如负号运算符“-”等。
- 双目运算符要求有两个操作数,如乘号运算符“*”等。
- 三目运算符要求有三个操作数,三目运算符只有一个“?:”。
运算符与操作数是相关联的,相同的运算符对不同类型的操作数所执行的运算是有差异的。
基本运算符及其表达式
“表达式”就是由运算符、操作数及标点符号组成的,能取得一个值的式子。本小节介绍的基本运算包括 算术运算 、 关系运算 、 逻辑运算 、 位运算 等。◆ 1、算术运算符及其表达式
- 算术运算符:包括:+(加)、-(减)、*(乘)、/(除)和%(求余),如下表所示。
优先级 运算符 名称 3 + 正,单目 - 负,单目 5 * 乘,双目 / 除,双目 % 取余,双目 6 + 加,双目 - 减,双目 - 算术表达式:由算术运算符连接的表达式称为“算术表达式”。
例如:a+b*3 和 (a+b)/4
注意:
- 表达式中每个变量都有确定的值时才能进行表达式求值。
- 注意数据溢出问题,应避免两个很接近的数直接相减、除数是一个很小的数、整数的连续乘运算等情况。
◆ 2、赋值运算符与赋值表达式
- 赋值:将数据存放在相应存储单元中称为“赋值”。如果该单元中已有值,赋值使新值取代旧值。
- 引用:从某个存储单元中取出数据使用,称为“引用”。引用也是对数据的使用,但不影响单元中的值,即一个量可以多次引用。
- 赋值运算符:“=”,其意义是将赋值号右边的值送到左边变量所标识的单元中。左操作数称为“左值”,而右操作数称为“右值”。
- 赋值表达式:由运算符连接的表达式称为格式为:<变量> = <表达式>;
例如:x=5+6; - 复合赋值运算:复合赋值运算符的要求与格式和赋值运算符完全相同,表示为:
<变量> <复合赋值运算符> <表达式>;
它等同于:<变量> = <变量> <运算符> (<表达式>);
例如:x+=5; 等同与 x=x+5;
注意:赋值号不是等号,它具有方向性。“左值”必须放在内存中可以访问且可以合法修改值的存储单元,通常只能是变量名;“右值”则可以是常量,也可以是变量或表达式,但一定能取得确定的值。
例如:下面的赋值运算是错误的:
3.1415926=pi; //左值不能是常数
x+y=z; //左值不能是表达式
设:const int N=30;
则:N=40; //左值不能是常变量
◆ 3、自增、自减运算
- 意义:使变量当前值加1或减1,再赋给该变量。
- 要求:操作数只能是变量,不能是常量或表达式
- 运算: 分前置和后置两种,例如:
int i=5, j=5, m, n;
m=i++; //后置++;相当于m=i; i=i+1; 结果:i的值为6,m的值为5;
n=++j; //前置++;相当于j=j+1;n=j; 结果:j的值为6,n的值为6;
◆ 4、逻辑运算、逻辑表达式和逻辑表达式的求值优化
- 逻辑运算用于判断分析,运算符包括关系运算符和逻辑运算符。
- 关系运算符:包括:>(大于)、>=(大于等于)、<(小于)、<=(小于等于)、==(等于)和!=(不等于),用来完成两个操作数的比较,结果为逻辑值:true(真)或false(假)。
- 逻辑运算符: 包括:!(逻辑非)、&&(逻辑与)和||(逻辑或),其操作数和运算结果均为逻辑量。逻辑运算符优先级和语义如下表所示。
优先级 运算符 名称 语义 2 ! 逻辑非,单目 操作数的值为真,则结果为假。 12 && 逻辑与,双目 当两个操作数全部为真是,结果为真,否则为假。 13 || 逻辑或,双目 两个操作数中有一个为真,则结果为真。
- 逻辑值:在c++中,逻辑值与整数有一个对应关系:true对应1,false对应0。反过来,0对应false,非0整数对应true。所以,逻辑运算的结果可作为整数参与其他运算;整型数也可参与逻辑运算。
- 关系表达式:由关系运算符连接而成的表达式,结果为逻辑值。
- 逻辑表达式:由逻辑运算符连接的表达式,结果为逻辑值。关系表达式是一种最简单的逻辑表达式。计算时,逻辑非优先级最高,关系运算其次,逻辑与和逻辑或最低。
- 逻辑表达式的求值优化:在逻辑表达式的求值过程中,并非先将所有逻辑运算都做完再得结果,而是一旦表达式的值能够确定,就不再进行后面的运算。(演示)
下面是几个实例:
例1:假定a=3, b=0,c=5,d=2,x=6,y=2; 试分析下面的关系表达式::
a>b>c //先求a>b,结果为true,即1,再将结果1与c比较,结果为假
a+b>c+d //等同于(a+b)>(c+d),结果为假
a>b&&a<c||(x>y)-!a
//相当于((a>b)&&(a<c))|| ((x>y)-(!a)),结果为true
例2:假定a=2, b=0, c=3; 则逻辑表达式 a||b++||c-- 产生的结果是:
【分析】:a=2,第一个操作数为1;1与任何值相或的结果总是1(true);所以不用再计算b++和c--,则此b的值仍为0,c的值仍为3;整个表达式的值为1。
例3:假定x=0, y=2, z=3; 求表达式 x&&(y=y*y)&&(z=z+3)的结果?【解答】
◆ 5、位运算
- 位运算:c++语言提供字位运算,直接对操作数的二进制位进行操作。
- 位运算符:包括:~(按位取反)、<<(左移)、>>(右移)、&(按位与)、|(按位或)、^(按位异或)。其中,~(按位取反)为单目运算符,其余均为双目运算符。
- 位运算举例:请参见演示。
◆ 6、逗号运算符与逗号表达式
- 逗号运算符:C++中,逗号既是分隔符,又是运算符,且优先级最低。
- 逗号表达式:用逗号连接起来的表达式,其一般格式为:
<表达式1>,<表达式2>,…,<表达式n> - 运算规则是:从左到右依次求出各表达式的值,并将最后一个表达式的值当做整个逗号表达式的值。
例如:假定a=1,b=2,c=3; 以下逗号表达式的结果是:
c=b=(a=3,4*3) //结果为:a=3,b=12,c=12,表达式的值为12
c=b=a=3,4*3 //结果为:a=3,b=3,c=3,表达式的值为12
c=(b=a=3,4*3) //结果为:a=3,b=3,c=12,表达式的值为12
◆ 7、sizeof( )运算符
sizeof运算符:用于计算存储一种数据类型或一个变量所需的字节数。一般格式为:
sizeof (<数据类型>) 或 sizeof(<变量名>)
关于sizeof()的几点说明:
- 数据类型可以是标准数据类型,也可以是用户自定义类型。
- 变量必须是已定义的变量。
- 括号可以省略,运算符与操作数之间用空格间隔。
sizeof()应用举例:
sizeof(int); //值为4
sizeof( float); //值为4
设:double x;
则:sizeof(x); //值为8