我的C++ 第三章 运算符和表达式

来源:互联网 发布:微信公众号积分墙源码 编辑:程序博客网 时间:2024/05/29 03:23

第三篇:运算符和表达式

一、C++的运算符、优先级和结合性:

对常量或变量进行运算或处理的符号称为运算符,参与运算的对象称为操作数。

优先级

运算符

功能

用法:(标识符代表运算对象)

结合性

1

::

全局域

::name

左→右

类域

class::name

名字空间域

 

 

 

 

 

 

 

 

 

 

 

2

 

 

2

成员访问

object.member

左→右

>

成员访问

pointer>member

左→右

   

 ( )

 

括号

expr

 

左→右

函数调用

name(expr_list)

类型构造

type(expr_list)

[ ]

数组下标

variable[expr]

左→右

++

后置递增

variable++

左→右

——

后置递减

variable--

左→右

typied

类型ID

typied(type)

左→右

 

运行时类型ID

typied(expr)

const_cast

类型转换

const_cast<type>(expr)

左→右

dynamic_cast

类型转换

dynamic_cast<type>(expr)

左→右

reinterpret_cast

类型转换

reinterpret_cast<type>(expr)

左→右

static_cast

类型转换

static_cast<type>(expr)

左→右

 

 

 

 

 

 

 

3

sizeof

对象大小

sizeof expr

右→左

类型大小

sizeof(typied)

++

前置递增

++variable

右→左

——

前置递减

--variable

右→左

按位取反

expr

右→左

!

逻辑非

expr

右→左

+

单目正

+expr

右→左

-

单目负

-expr

右→左

*

间接引用

*pointer

右→左

&

取地址

&variable

右→左

        

 

new

 

分配对象

new type

右→左

分配并初始化对象

new type(expr_list)

右→左

分配数组

new type[ ]

右→左

delete

释放对象

delete pointer

右→左

释放数组

delete [ ] pointer

右→左

(type)type()

强制类型转换

typeexprtype(expr)

右→左

4

>*

接访问指针指向的类成员

pointer>*pointer_to_member

左→右

.*

直接访问指针指向的类成员

object.*pointer_to_pointer

左→右

 

5

*

expr*expr

左→右

/

expr/expr

左→右

%

求余/求模

expr%expr

左→右

6

+

expr+expr

左→右

expr-expr

左→右

7

<< 

按位左移

expr<<expr

左→右

>> 

按位右移

Expr>>expr

左→右

8

< <= > >=

比较大小

expr operator expr

左→右

9

== !=

比较是否相等

expr operator expr

左→右

10

&

按位与

expr & expr

左→右

11

^

按位异或

expr ^r expr

左→右

12

|

按位或

expr | expr

左→右

13

&&

逻辑与

expr && expr

左→右

14

||

逻辑或

expr || expr

左→右

15

?:

条件运算

expr ?expr: expr

右→左

16

=

赋值

variable=eexpr

右→左

+== *= /= %= <<= >>= &=  |=  ^=

复合赋值

variable opterator expr

右→左

17

throw

抛出异常

throw expr

右→左

18

逗号

expr,expr

左→右

 

说明:1、优先级和结合性决定运算中的优先关系。

            2、序号越小,优先级越高。

           3、运算符的结合性决定优先级相等的运算符组合在一起时的运算次序,同一优先级的运算符有相同的结合性。

        Eg. ((a+b)+c)-d   //先算a+b,再算加c,最后减d

                -(++a)    //先算++a,再取相反数(加符号)

    4、根据操作数的个数不同,运算符分为单目(一元)、双目(二元)、三目(三元)运算符。

          三目运算符只有条件运算符 ?: 

二、基本运算符和表达式:

        表达式就是由运算符、操作数及标点符号组成的、能得到一个值的式子

    本篇介绍算术运算符、关系运算符、逻辑运算符、位运算。

1、       算术运算:

1)算数运算有: + (加)、—(减)、*(乘)、

 /(除)、 %(求余)

 2)运算符的重载:相同的运算符对应不同的操作数执行的运算有差异

 3/:当两个操作数均为整数时,所执行的运算为整除,结果为整数。

Eg.     5/4   结果为:1

            ② 只有一个操作数为实数,则两个操作数均转化为double型。“/”称为普通的除,结果是实数。Eg. 5/4.0  结果为:1.25

     %”:称为求余运算符,也称为求模,就是求两个相

除后的余数,所以两个操作数必须均为整数。

如果两个整数中有负数,则结果符号和被除数

相同。Eg. 6%3    结果为:0

          6%7    结果为:6

          7%6    结果为:1

          -7%6   结果为:-1

          7%-6   结果为:1

          -7%-6  结果为:-1

 (4) 当表达式中的每个变量都有确定的值时才能进行表

达式求值

5) 数据溢出问题:运算结果超出对应数据类型的表示范围(但计算机不会提示出错,所以要注意检查程序)

2、赋值运算:

 1)赋值:是将数据存放到变量所标识的存储单元的操作。如果该单元中已有值,赋值操作则以新值取代旧值。

 2)引用:从某个存储单元中取出数据的操作。引用不

影响内存单元中的值,可多次引用。常量只能引用,不能赋值。

 3)赋值号不是等号,它具有方向性,即将赋值号右边的送到左边变量所标识的内存单元中。左值:必须放在内存中可以访问且可以合法修改值的存储单元中。右值:可以是常量、变量,表达式,但必须是具体的值。

      Eg.下面的赋值运算是错的:

                  3.1415926=pi      //左值不能为常数

                  x+y=z            //左值不能是表达式

                  const int N=30

                  N=40            //常变量不能被重新赋值

  a=5+6      //先计算在赋值

       d=c=b=a+1 //a+1bcd

 (4)符合赋值运算符:

     包括:+= -= *=  /=  %=

格式为:

       变量 复合赋值运算符 表达式   

它等同于                             

       变量 =变量  运算符 表达式

例如:x+=5等同于:x=x+5

 

 a+=3     //等效a=a+3;

    a*=b-c   //等效a=a*(b-c)

    a-=(b+6) //等效a=a-(b+6)

3、自增、自减运算:(++ --

 (1)  意义:使变量的当前值加1或减1后再赋值给该变量自己。

 Eg.  i++         //相当于i=i+1

         j--         //相当于j=j-1

(2) ++运算符要求操作数只能是变量,不能是常量或表达式:Eg. a++   a+1

         前者自身的值变了,后者没变

 3 ++与——的前置与后置:

           ① 对于单独的自增、自减表达式,运算符前置与后置无区别,但有其他的运算参与时

        则会有区别.

 ②法则:运算符前置,变量先增减后引用

                  运算符后置,变量先引用后增减

      Eg. int i==5,j=5,m,n;

          m=i++;   //相当于m=i,i++,结果m=5i=6

                       n=++j;   //相当于j++,n=j,结果n=6,j=6

4 、逻辑运算:(用于判断分析)

   (1)逻辑运算符:(分为关系运算符和逻辑运算符)

 

关系运算符:

 

>(大于) >=(大于等于) <(小于) <=(小于等于) ==(等于) !=(不等于)

逻辑值:

 

 

 

逻辑真:true 1或非0

逻辑假:false 0

逻辑运算符:

!、&&||

 

  关于优先级:

  !(非)、算数运算符、关系运算符、&&和||、赋值运算符

   高------------------------------------------------------->低

Eg.  int a=10,b=20,c=30;

     float x=1.8,y=2.4;

  求:a<b&&x>y||a<b-!c  =?

求值顺序:

      (a<b)&&(x>y)||(a<(b-(!c)))

          逻辑表达式的求值优化:

Eg. a=2,b=0,c=3

a||b++||c--       表达式结果为:1

表达式a的值就确定了结果 这是或运算

  5 位运算:~ << >> & | ^

     (1)  按位取反运算符“~”:

         将操作数的每个二进制位取反,即1变为00变为1.

        Eg.  整数a的值:10011011

                ~a的值: 01100100

(2)       左移运算符“<<”:

    运算的一般格式:a<<n

    (其中a为整数,n为一个正整数常数)

   a的二进制数依次向左移动n个二进制位,并在低位补0.移位运算不影响a本身的值,只是产生一个中间量。

   Eg.变量a的值:00000010

      b=a<<3的值:00010000   (但a的值没变)

(3)           右移运算符“>>”:

     运算的一般格式:a>>n

     a的二进制数依次向右移动n个二进制位,忽略移位后的小叔部分,并在高位补0.移位运算不影响a本身的值,只是产生一个中间量。

 

  Eg. 变量a的值:00010000

          a>>2的值:00000100

(4)           按位与运算符“&”:

运算规则:对应位均为1时,该位运算结果为1;否则为0.

Eg. 整型变量:a : 01001101

              b: 00001111

a&b的结果为:

a    0 1 0 0 1 1 0 1

              b    0 0 0 0 1 1 1 1

          ----------------------------------------

           a&b    0 0 0 0 1 1 0 1

(5)       按位或运算符“|”:

运算规则:只要有一个数对应的位为1,运算结果就为1;若两个数对应的位均为0,则结果为0.

Eg.整型变量:a : 01001101

             b: 00001111

a|b的结果为:

a    0 1 0 0 1 1 0 1

              b    0 0 0 0 1 1 1 1

          ----------------------------------------

           a|b    0 1 0 0 1 1 1 1

(6)        按位异或运算符“^”:

    运算规则:当对应位的值不同时,该位运算结果为1;否则为0.

Eg.整型变量:a : 01001101

             b: 00001111

a^b的结果为:

a    0 1 0 0 1 1 0 1

                               b    0 0 0 0 1 1 1 1

          ----------------------------------------

           a^b 0 1 0 0 0 0 1 0

原创粉丝点击