现在的位置: 首页 > 综合 > 正文

运算符优先级

2013年08月21日 ⁄ 综合 ⁄ 共 3357字 ⁄ 字号 评论关闭

C++ 运算符优先级列表

http://www.cppreference.com/operator_precedence.html

Precedence Operator Description Example Associativity
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 AND flags = flags & 42; left to right
10 ^ Bitwise exclusive OR flags = flags ^ 42; left to right
11 | Bitwise inclusive (normal) OR flags = flags | 42; left to right
12 && Logical AND if( conditionA && conditionB ) ... left to right
13 || Logical OR if( 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 uation operator for( i = 0, j = 0; i < 10; i++, j++ ) ... left to right

【举例说明1】

'()'运算符 '[]'运算符 '*'运算符的优先级为:

'()' > '[]' > '*'

例题1:int (*a[])(int);
分析:从a开始,先与[]结合,说明a是一个数组,再与*结合说明a是一个指针数组,然后再与()结合,说明

是一个指向函数的指针数组,然后进入()里面,与int 结合,,说明函数有一个整型变量参数,最后再与int

结合,说明函数返回类型是int。所以是a是一个函数指针数组,所有函数都是有一个参数int型,函数返

回类型为int型.

本质:它是一个指针,特别的是一个指针数组,更特别的它是一个函数指针数组。

用法

#include<stdio.h>
int fun(int a)
{
return a+1;
}
int main()
{
int (*p[10])(int);
int i;
p[0] = fun;
i = (p[0])(10);
printf("i=%d\n", i);
return 0;
}
int (*p())[10]

例题2:int *(*p(int*, int))[3];

分析:从p 开始,先与()结合,说明P 是一个函数,然后进入()里面,与int*和int结合,说明该函数有二个

参数,分别为int*整型变量指针参数和int整型变量参数,然后再与外面的*结合,说明函数返回的是一个

指针,然后到最外面一层,先与[]结合,说明返回的指针指向的是一个数组,然后再与*结合,说明数组里的

元素是指针,然后再与int 结合,说明指针指向的内容是整型数据.所以p是一个参数为整数指针和整数

且返回一个指向由整型指针变量组成的数组的指针变量的函数.

本质:它是一个函数,特别的是一个返回指针的函数,更特别的是它返回的指针是指向一个数组指针。

用法

int * (*p(int* a, int size))[10]
{
int *(*m)[10];
int i;
// a[1] = &fun;
m = (int *(*)[10])calloc(10, sizeof(int*));
if (m == NULL)
{
printf("calloc error\n");
exit(1);
}
//int arr[10];
for (i = 0; i < size; i++)
*(*m+i) = &a[i];
return m;
}

例题3:int* (*(*pf)(int*, int))[10];

分析:从pf 开始,先与*结合,说明p是一个指针,在与()结合,说明p是指向一个函数,然后进入()里面,

与int*和int结合,说明该函数有二个参数,分别为int*整型变量指针参数和int整型变量参数,然后再

与外面的*结合,说明函数返回的是一个指针,然后到最外面一层,先与[]结合,说明返回的指针指向的是

一个数组,然后再与*结合,说明数组里的元素是指针,然后再与int 结合,说明指针指向的内容是整型数

据.所以p是一个指针,指向一个参数为一个整数指针和一个整数且返回一个指向由整型指针变量组成

的数组的指针变量的函数.

本质:它是一个指针,更特别的是它指向的函数如例题2这样的函数。

用法

typedef int* (*(*pftype)(int*, int))[10];

void main(void)

{

pftype funp; //定义一个指向函数的指针变量
funp =&p; //把该指针指向例题2中的函数地址

}

【举例说明2】

逗号运算符的优先级别在所有运算符中最低。
逗号表达式的运算过程为:从左往右逐个计算表达式。

逗号表达式作为一个整体,它的值为最后一个表达式(也即表达式n)的值。

抱歉!评论已关闭.