赞
踩
一元运算符(单目)的优先级最高,其次是乘除求余,最后是加减。并且具有左结合性,即当优先级相同时,从左到右计算。
注意:部分运算符的规则如下:
21/6==3,余数被舍弃
21%-4==1 ; -21%4==-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类型的最终变量,输出这个变量。
转换规则:char->int->unsigned int->long->float->double
先利用优先级判断计算顺序,然后利用转换规则解出最终的值
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
优先级
表达式构造
i<=j<=k;
//这个表达式不成立,根据左结合,先算(i<=j),其结果是1/0。所以只要k大于等于1,右面的式子即可成立。
i<=j &&j<=k; //正确表达
短路求值
由于&&和||运算符都是左结合,因此有如下规则:
对于&&,仅当左侧对象为真时,才计算右侧对象的值
对于||,仅当左侧对象为假时,才计算右侧对象的值
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"
位运算符运算的对象是整型,用来处理二进制数字,运算过程不会改变操作对象本身的值,操作的结果为右值。位运算符分类如下:
其中~是一元运算符,其余都是二元运算符。
C++中只规定的运算符求值次序:
后置自增/自减>前置自增/自减>逻辑非>算术>关系>逻辑(与或)>条件(分支)>赋值>逗号
特殊情况下会出现歧义
int i=0,j;
j=i*2+ ++i;
//优先级(++i)>(i*2)>(+),所以运算的结果是j=3(在VS环境中)
//但是在其他的环境中可能会出现先算(i*2)再算(++i),结果可能出现j=1
提示:不要对表达式中同一个对象进行既读又写的操作!!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。