c语言中运算符的优先级
2011-03-09 21:06
309 查看
最近看了本叫《C陷阱与缺陷》(C traps and pitfalls)的书。
书中对运算符的优先级讲的很清楚:为了便于复习,今天就回忆一下了:
当然至高无上的是(),
最高优先级的是: (),[] , . , ->,
(它们分别是函数符号,数组下标符号,成员符号) , 结合性从左往右;
其次,单目运算符: !,~, ++, --, - (type) *, &, sizeof 结合性从右往左;
再次,算术运算法: * 、/、% 结合性从左往右;
再次:
+、- 结合性从左往右;
再次,移位运算符: <<, >>, >>> 结合性从左往右;
再次, 比较运算符: <, <=, >, >= 结合性从左往右;
再次: ==, != 结合性从左往右;
再次, 逻辑运算符:
首先,按位运算符: &, ^, | , 且&优先于^ ,^优于 | 结合性从左往右;
其次,逻辑运算符 &&, ||, 且&&优于||。 结合性从左往右;
接着是, 三目运算符:? : 结合性从右往左;
其次是, 赋值运算符: = 结合性从右往左;
最后是,逗号运算符: , 结合性从左往右;
总结:要记住:
1.比较运算符优于逻辑运算符
2.移位运算符介于算术运算符和比较运算符之间
3.除单目运算符外,算术运算符的优先级最高。
下面看一个关于++,--的有趣的小例子:
#include<stdio.h>
int main(void) {
int a;
int b =3;
int c = 4;
a = --b + b++ + c + b--; // ++等单目运算符的结合性是从右往左,等式等价于a = --b + (b++) + c + b--;
printf("%d/n", a); // a = 2 + 2 + 4 + 2; //前置运算是在等式的所有的计算前计算,后置计算是在等式的所有的计算完之后计算;
b = 3;
c = 4;
a = --b + b + (++c) + b--; //a=11 = 2 + 2 +5 + 2;
printf("%d/n", a);
b = 3;
c = 4;
a = --b + (b++) + c + b--; // a = 2 + 2 + 4 + 2;
printf("%d/n", a); //a=10
return 0;
}
从上面可以看出: 前置的++,--是在整个等式运算之前计算,而后置的++,--是在整个等式计算之后运算。
看看下面的代码是不是很明了:
书中对运算符的优先级讲的很清楚:为了便于复习,今天就回忆一下了:
当然至高无上的是(),
最高优先级的是: (),[] , . , ->,
(它们分别是函数符号,数组下标符号,成员符号) , 结合性从左往右;
其次,单目运算符: !,~, ++, --, - (type) *, &, sizeof 结合性从右往左;
再次,算术运算法: * 、/、% 结合性从左往右;
再次:
+、- 结合性从左往右;
再次,移位运算符: <<, >>, >>> 结合性从左往右;
再次, 比较运算符: <, <=, >, >= 结合性从左往右;
再次: ==, != 结合性从左往右;
再次, 逻辑运算符:
首先,按位运算符: &, ^, | , 且&优先于^ ,^优于 | 结合性从左往右;
其次,逻辑运算符 &&, ||, 且&&优于||。 结合性从左往右;
接着是, 三目运算符:? : 结合性从右往左;
其次是, 赋值运算符: = 结合性从右往左;
最后是,逗号运算符: , 结合性从左往右;
总结:要记住:
1.比较运算符优于逻辑运算符
2.移位运算符介于算术运算符和比较运算符之间
3.除单目运算符外,算术运算符的优先级最高。
下面看一个关于++,--的有趣的小例子:
#include<stdio.h>
int main(void) {
int a;
int b =3;
int c = 4;
a = --b + b++ + c + b--; // ++等单目运算符的结合性是从右往左,等式等价于a = --b + (b++) + c + b--;
printf("%d/n", a); // a = 2 + 2 + 4 + 2; //前置运算是在等式的所有的计算前计算,后置计算是在等式的所有的计算完之后计算;
b = 3;
c = 4;
a = --b + b + (++c) + b--; //a=11 = 2 + 2 +5 + 2;
printf("%d/n", a);
b = 3;
c = 4;
a = --b + (b++) + c + b--; // a = 2 + 2 + 4 + 2;
printf("%d/n", a); //a=10
return 0;
}
从上面可以看出: 前置的++,--是在整个等式运算之前计算,而后置的++,--是在整个等式计算之后运算。
看看下面的代码是不是很明了:
void strcpy(char* dest, const char* src){ int i = 0; while( (dest[i++]=src[i++]) != '/0'); }
void strcpy(char* dest, const char* src){ int i = 0; while( dest[i++]=src[i++] ); }
void strcpy(char* dest, const char* src){ while( *(dest++) = *(src++) ); }
void strcpy(char* dest, const char* src){ while(*dest++=*src++); }
相关文章推荐
- C语言运算符及其优先级汇总表口诀
- C语言 运算符优先级
- C/C++编程(四)--C语言运算符优先级
- 【C语言】C语言运算符优先级列表
- C语言:运算符优先级
- A【1-1-12】C语言运算符优先级与结合方向
- C语言运算符及优先级
- C语言中的运算符及其优先级
- C语言中运算符优先级
- C语言——运算符优先级问题
- C语言中的运算符及其优先级
- C语言中运算符的优先级排序表
- C语言不起眼的运算符的优先级
- C语言(3) 运算符及优先级
- A【1-1-12】C语言运算符优先级与结合方向
- C语言的运算符的优先级
- C语言中运算符的优先级排序表
- C语言语法之运算符及优先级
- C语言运算符的“优先级口决”
- C语言的运算符的优先级与结合性+ASCII表