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)的值。