1.6 运算符和表达式

程序中相当一部分数据处理和“ 语句 ”是通过“ 表达式 ”表达的,其中使用各种“ 运算符 ”。

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值