C++中运算符优先级的学习注解

原创 2006年06月20日 09:55:00

提起运算符的优先级,很多了解C++的过来人都会想:这有什么难的?不就是谁的优先级高就算谁么。确实如此,运算符的优先级不是一个大问题,但对于一个初学者来说,却经常容易在上面迷糊与犯错。而对于一个了解C++的人来说,我相信也会偶尔在上面摔倒,不信就继续往下读。 

“优先级高的先运算”带来的困惑 

C++中运算符的优先级有一张表,表里把运算符进行了分类,这张表是不需要死记硬背的,只要有个大致的轮廓就OK了。例如应该记住最低优先级是逗号运算符,其次是赋值运算符,再其次是三目运算符。而关系运算符的优先级高于逻辑运算符(不包括逻辑非运算),算术运算符的优先级高于关系运算符,象++和﹣﹣的优先级比前面几个都高,但最高的要属()了。知道这些后,你的脑海里一定有一条准则了:优先级高的先运算。那么下面看一个例子:

int x=1,y=0;

!x&&x+y&&++y;

上面的语句中出现了!、&& 、+、++这四个运算符,那么问题来了,到底先算谁呢?

有一个姓蔡的同学站起来说,++运算符在这里面优先级最高,理所应当最先算++,既先计算++y,再算!x,再算x+y,最后把它们&&起来。按照蔡同学的思路,第二步的结果是0&&x+y&&1,由于&&是严格运算,有一个为0结果既为0,所以不需要计算x+y了,整个语句的结果是:假。按照上面蔡同学的说法,执行完后y的值应该是1了,这对不对呢?

一位姓高的同学站起来反驳道,我觉得应该先计算!x,如果值为假,则不需要计算下去,最后结果为假。如果值为真,再计算x+y,同理如果其值为真,再去计算++y,否则最后结果也为假。

蔡同学不服起来说,高同学你觉得++和!谁的优先级高呢?高同学答道,那当然是++高。蔡同学接着问,那为什么还要先计算!呢?高同学答不出来了。

是呀,为什么要先算!呢? 

加括号确定优先级的方法

 高同学说的是正确的,为什么呢?下面我给大家解释一下。当多个优先级不同的运算符在一起时,为了不混淆,可以先加上括号,这样就分出层次了,相同层次的考虑结合性问题,当确定下来先算那块时,再往这块里面深入。例如上面的例子,我们可以这样加上括号:从左向右看,由于!比&&优先级高,所以有(!x),又由于&&比+优先级低,所以有(x+y),而++优先级高于&&,所以(++y)。这样整个式子就变成了:(!x)&&(x+y)&&(++y),最外层的是两个&&运算,由于&&的结合性是从左至右,所以上式可看成:A&&B&&C,先计算A,再计算B,最后算C。由于x=1,则!x就为假,后面的就不需要再算了,整个语句的值为假。执行完后,y的值没变,还是0。

所以碰到不清楚先算谁后算谁时,先加个括号看看,就明白了先后次序。下面做一个加括号的练习:给语句c=a>b?a:b;加括号。此语句有三个运算符:=、>、? :,应该怎样加括号呢?

第一种方案:c=((a>b)?a:b);

第二种方案:c=(a>(b?a:b));

第三种方案:(c=a)>(b?a:b);

应该是那一种呢?按照运算符优先级的高低顺序,>优先级高于=,所以不可能把(c=a)括起来。而>优先级高于? :运算符。所以也不可能把(b?a:b)括起来。因此,第一种答案正确。

 

下面再看一个类似的例子:

int i=8,j=4,k;

k=i<j?++i:++j;

猛然一看,有些人上来可能就要计算++i和++j了。这里不妨先加括号看看。从左至右看,<的优先级高于=而且又高于? :,所以有k=(i<j)?++i:++j,再继续向右看,由于++高于? :,所以k=(i<j)?(++i):(++j),这样相当于k=A?B:C,先算A的值,若为真,则值为B,既算一下++i,若为假,则值为C,既算一下++j。整个语句执行完后,k的值为5,i的值为8,j的值为5。

所以运算符的优先级千万要小心,既不是想象的那么难,也不是想象的那么容易。

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

运算符的优先级和结合性 优先级 运算符 名称或含义 使用形式 结合方向 说明 1 后置++ 后置自增运算符 变量名++ 左到右 后置--...
  • lfb_2048
  • lfb_2048
  • 2017年03月14日 12:01
  • 2458

一个例子让你明白C++的运算符优先级

算术运算符 关系运算符 赋值运算符   这是她们的优先级   借助这个例子就会记住啦:             int a=1,b=1,c=0;             c= a+b=...
  • bailu66
  • bailu66
  • 2012年03月30日 17:39
  • 954

写代码不能太偷懒 -- 关于c/c++运算符优先级

使用了c编程也有十几个年头的,今天居然因为一个运算符优先级的问题调试程序用了1个多小时。 int TransSock(int nReadSock, int nWriteSock) { c...
  • paky_du
  • paky_du
  • 2018年01月07日 15:48
  • 25

C++ 运算符优先级列表及学习注解

PrecedenceOperatorDescriptionExampleAssociativity1()[]->.::++--Grouping operatorArray accessMember a...
  • FG2006
  • FG2006
  • 2011年04月06日 20:39
  • 1084

【C++】《C++ Primer Plus》笔记(5)——运算符优先级

递增运算符++和递减运算符-- 它们都有点缀和后缀表达式两种。两个版本对操作数的影响是一样的,但是相应的时间不一样,执行的速度可能有细微的差别如果有用户定义的前缀和后缀运算符,使用前缀格式要比使用后缀...
  • icurious
  • icurious
  • 2017年02月28日 08:54
  • 225

C++学习-C++运算符优先级

关系运算符: >  2  >= 3 ==  5 !=  6 前4个运算级别高于后两者; 关系运算符优先级低于算术运算符优先级; 关系运算符优先级高于赋值运算符优先级;...
  • zhangshan415
  • zhangshan415
  • 2012年05月15日 19:50
  • 296

C 语言运算符优先级(记忆口诀)

优先级 运算符 名称或含义 使用形式 结合方向 说明 1 [] 数组下标 数组名[常量表达式] 左到右   () 圆括...
  • u013630349
  • u013630349
  • 2015年08月12日 15:09
  • 8241

C++ 运算符优先级和结合性(MSDN)

 
  • zhujiangm
  • zhujiangm
  • 2007年11月17日 17:32
  • 1241

JavaScript运算符优先级

JavaScript脚本编程中,运算表达式中可能含有多个运算符,同其他程序语言一样,这些运算符也是有处理的先后顺序的,运算优先级 如表所示。 javascript运算符优先级运算符优先级运算符简要...
  • andyhong110
  • andyhong110
  • 2010年11月19日 17:39
  • 1567

spring框架学习(五)注解

注解Annotation,是一种类似注释的机制,在代码中添加注解可以在之后某时间使用这些信息。跟注释不同的是,注释是给我们看的,java虚拟机不会编译,注解也是不编译的,但是我们可以通过反射机制去读取...
  • lishuangzhe7047
  • lishuangzhe7047
  • 2014年03月14日 22:08
  • 57937
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++中运算符优先级的学习注解
举报原因:
原因补充:

(最多只允许输入30个字)