您的位置:首页 > 编程语言 > C语言/C++

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

2011-04-06 20:39 441 查看
PrecedenceOperatorDescriptionExampleAssociativity
1()
[]
->
.
::
++
--
Grouping operator
Array access
Member access from a pointer
Member access from an object
Scoping operator
Post-increment
Post-decrement
(a + b) / 4;
array[4] = 2;
ptr->age = 34;
obj.age = 34;
Class::age = 2;
for( i = 0; i < 10; i++ ) ...
for( i = 10; i > 0; i-- ) ...
left to right
2!
~
++
--
-
+
*
&
(type)
sizeof
Logical negation
Bitwise complement
Pre-increment
Pre-decrement
Unary minus
Unary plus
Dereference
Address of
Cast to a given type
Return size in bytes
if( !done ) ...
flags = ~flags;
for( i = 0; i < 10; ++i ) ...
for( i = 10; i > 0; --i ) ...
int i = -1;
int i = +1;
data = *ptr;
address = &obj;
int i = (int) floatNum;
int size = sizeof(floatNum);
right to left
3->*
.*
Member pointer selector
Member pointer selector
ptr->*var = 24;
obj.*var = 24;
left to right
4*
/
%
Multiplication
Division
Modulus
int i = 2 * 4;
float f = 10 / 3;
int rem = 4 % 3;
left to right
5+
-
Addition
Subtraction
int i = 2 + 3;
int i = 5 - 1;
left to right
6<<
>>
Bitwise shift left
Bitwise shift right
int flags = 33 << 1;
int flags = 33 >> 1;
left to right
7<
<=
>
>=
Comparison less-than
Comparison less-than-or-equal-to
Comparison greater-than
Comparison geater-than-or-equal-to
if( i < 42 ) ...
if( i <= 42 ) ...
if( i > 42 ) ...
if( i >= 42 ) ...
left to right
8==
!=
Comparison equal-to
Comparison not-equal-to
if( i == 42 ) ...
if( i != 42 ) ...
left to right
9&Bitwise ANDflags = flags & 42;left to right
10^Bitwise exclusive ORflags = flags ^ 42;left to right
11|Bitwise inclusive (normal) ORflags = flags | 42;left to right
12&&Logical ANDif( conditionA && conditionB ) ...left to right
13||Logical ORif( conditionA || conditionB ) ...left to right
14? :Ternary conditional (if-then-else)int i = (a > b) ? a : b;right to left
15=
+=
-=
*=
/=
%=
&=
^=
|=
<<=
>>=
Assignment operator
Increment and assign
Decrement and assign
Multiply and assign
Divide and assign
Modulo and assign
Bitwise AND and assign
Bitwise exclusive OR and assign
Bitwise inclusive (normal) OR and assign
Bitwise shift left and assign
Bitwise shift right and assign
int a = b;
a += 3;
b -= 4;
a *= 5;
a /= 2;
a %= 3;
flags &= new_flags;
flags ^= new_flags;
flags |= new_flags;
flags <<= 2;
flags >>= 2;
right to left
16,Sequential evaluation operatorfor( i = 0, j = 0; i < 10; i++, j++ ) ...left to right
 
C++中运算符优先级的学习注解


 
提起运算符的优先级,很多了解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++ access c float class