C++各种运算符详细笔记讲解

C++的运算符

一.算术运算符

一元运算符(单目)的优先级最高,其次是乘除求余,最后是加减。并且具有左结合性,即当优先级相同时,从左到右计算。

  1. 单目:+或-(一元正值/负值运算,例如:+5/-5)
  2. 双目1:*或/或%
  3. 双目2:+或-

注意:部分运算符的规则如下:

  1. 整数的算术运算的结果还是整数,如21/6==3,余数被舍弃
  2. 对于%求余来说,要求两个数都是整数,计算被除数除以除数的余数。(若其中有负数,则运算结果和被除数的符号一致,如下)21%-4==1 ; -21%4==-1

表达式中若运算对象的数据类型不同,则编译器会自动进行类型转换,即隐式类型转换。规则如下:

  1. 小数据类型向大数据类型转换。(设:i为int,u为unsigned int型,f是float型,d是double型,) 'a'+10+u+d-i/f

    在该式中,先计算i/f(优先级顺序),得到一个float型t1。接着计算’a’+10,得到一个int型的t2。接着算t2+u,得到一个unsigned int型的t3。接着算t3+d,得到一个double型的t4。接着算t4-t1,得到一个double类型的最终变量,输出这个变量。

  2. 转换规则:char->int->unsigned int->long->float->double

  3. 先利用优先级判断计算顺序,然后利用转换规则解出最终的值

unsigned int用来表示无符号整型(均表示大于等于0的值)。
而int/long/long long/short都是带符号的整型。

二.赋值运算符(=)

赋值符的左边必须是一个支持写操作的左值。算术表达式必须为右值,将此值赋值给左边

int i=0,j=i;  //对J初始化并赋值
i+j=10;  //错误语句:算术表达式必须在赋值符的右边

如果赋值符左右两侧对象的类型不同,则编译器自动把右侧对象的值转换为左侧,并且类型与左侧一致。

int i=0;
double d=3.14159;
i=d;
cout<<i;  //结果为3
cout<<d;  //结果为3.14159
//该操作将右侧值赋给左侧,且左侧类型不变。右侧值和右侧类型在此操作中始终不变。

赋值运算具有右结合性,如下

i=j=5;  //先将5赋值给j,再将j=5赋值给i

由于赋值符的优先级比较低,所以通常需要加括号才能正确执行。

i=2+j=4;  //错误表达,2+j是运算表达,不能作为右侧赋值符的左侧对象
i=2+(j=4);  //正确表达,j=4的值加2赋值给i,最终j=4,i=6

三.自增自减运算符

为了简化i+=1或者i-=1这类的运算符,c++提供了++和–运算符。

int i=0,j;
j=i++;  //先操作再++
j=++i;  //先++再操作

不同形式的解释

int i=0,j;
j=i++;  //相当于(j=i)然后(i++/i+=1),结果是j=0,i=1
j=++i;  //相当于(j=(i+=1)),结果是j=2,i=2

四.逻辑和关系运算符

优先级

  1. 逻辑非(!)
  2. 小于(<)
  3. 小于等于(<=)
  4. 大于(>)
  5. 大于等于(>=)
  6. 等于(==)
  7. 不等于(!=)
  8. 逻辑与and(&&)
  9. 逻辑或or(||)

表达式构造

i<=j<=k;  
//这个表达式不成立,根据左结合,先算(i<=j),其结果是1/0。所以只要k大于等于1,右面的式子即可成立。
i<=j  &&j<=k;  //正确表达

短路求值

由于&&和||运算符都是左结合,因此有如下规则:
  1. 对于&&,仅当左侧对象为真时,才计算右侧对象的值

  2. 对于||,仅当左侧对象为假时,才计算右侧对象的值

     int i=1,j=2;
     bool b=!i && ++j;
     //结果,b=0,j=2
     //原因:根据优先级,表达式的顺序为:(!i)&&(++j),由于!i的值为假(0),在&&中根据短路求值,左侧为假,程序直接结束,不会计算右侧的表达式。
    

五.逗号运算符

逗号表达式的求值方法是从左向右计算每个运算对象,结果是最右边的对象。

int i,j;
i=(j=3,j+=6,5+6);
// 括号中,先算j=3,再算j+=6(j=9),最后算5+6=11。最终将11赋值给i。
所以i=11,j=9;

在所有运算符当中,逗号运算符的优先级最低(逗号<赋值<逻辑<关系<算术)

六.条件运算符(类似于分支语句)

**条件运算符的优先级高于赋值小于逻辑小于关系 **
条件运算符(?:)唯一的三目运算符,格式如下:

cond?expr1:expr2;
//cond是判断语句,为真进入expr1并返回expr1的值;为假进入expr2并返回expr2的值

列如:将三个对象中值最大的赋给max

int a=4,b=5,c=6,max;
max=a>b? (a>c?a:c):(b>c?b:c);

上述代码为嵌套条件运算符,比较复杂。根据优先级首先进入条件语句判断a>b? 若为真则进入(a>c?a:c);若为假则进入(b>c?b:c)。因为a<b,所以进入假,接着又是一个条件运算符,由于b<c,所以得到c(假的条件)。所以最大的条件运算符的结果是c(6),最终将6赋值给max。语句结束。

简单举例:

int i = 10;
double j = 3.111333;
i = j;
i == 3 ? cout << "Yes" << endl : cout << "NO" << endl;
//输出结果为"Yes"

七.位运算符

位运算符运算的对象是整型,用来处理二进制数字,运算过程不会改变操作对象本身的值,操作的结果为右值。位运算符分类如下:

  1. ~(按位取反)
  2. <<(左移)
  3. (>>)(右移)
  4. &(位与)
  5. |(位或)
  6. ^(位异或)

其中~是一元运算符,其余都是二元运算符。

八.求值次序

C++中只规定的运算符求值次序:

后置自增/自减>前置自增/自减>逻辑非>算术>关系>逻辑(与或)>条件(分支)>赋值>逗号

特殊情况下会出现歧义

int i=0,j;
j=i*2+ ++i;
//优先级(++i)>(i*2)>(+),所以运算的结果是j=3(在VS环境中)
//但是在其他的环境中可能会出现先算(i*2)再算(++i),结果可能出现j=1

提示:不要对表达式中同一个对象进行既读又写的操作!!!

  • 10
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值