读书人

玩儿转C语言:运算符的优先级跟结合性

发布时间: 2013-01-23 10:44:50 作者: rapoo

玩儿转C语言:运算符的优先级和结合性

C语言中,优先级规定了当多个运算符同时存在时表达式的求值顺序,结合性指出当多个优先级相同的运算符存在时表达式的求值顺序。

C语言的优先级列表如下(最新版取自:http://en.cppreference.com):

玩儿转C语言:运算符的优先级跟结合性

例如:

1、优先级示例

num_1 = test << 3 + num_2 ;

因为算术运算符 ‘+’ 的优先级(4)要高于逻辑运算符 ‘<<’(5),所以该语句实际相当于:num_1 = test << (3 + num_2),这并非本意。为了清楚的表达,就需要人为干预一下,写成:

num_1 = (test << 3) + num_2 ;

因为括号的优先级最高,则先计算括号里边的表达式,然后再计算括号外边,这跟常见的数学运算是一致的。

所以,在处理运算符优先级不是很明了的情况时,一定要人为干预增加括号,这样可以完全避免歧义发生;虽然添加括号可能会使表达式难以理解,但是为了正确性只能如此,不过可以利用空格对括号进行区域划分,最大限度增加可读性。例如:

if ( ( 2 < num_1) && (num_1 < 5) )

2、结合性示例

num = a / b * c ;

因为 ‘/’ 和 ‘*’ 的优先级相同,结合性就决定表达式的求值顺序,该算术表达式的结合性是自左向右,则从左边开始开始运算,实际解释成:

num = ( a / b ) * c ;


注意事项:

1、优先级最高的是数组下标、函数调用操作符、结构体成员选择符、后自增/自减等,都是自左向右的结合性。因此

2、其次是单目运算符,包括指针解引用、取地址符、前自增/自减等,自右向左的结合性。例如: *P++ 应该解释成 *(P++) ,即取P指向的对象,然后P自增1,虽然后自增++优先级高于*,但是后自增的特性决定了先对P进行运算,运算完成后再P自增1;(*P)++指先取P所指向的对象,然后对该对象加1,由于括号优先级高则先计算括号内部表达式,++运算符对括号这个数据整体起作用。

3、接着是双目运算符,其中算术运算符的优先级最高,移位运算符次之,关系运算符再次之,然后是逻辑运算符。

4、剩下的是三目运算符和赋值运算符。

5、任何一个逻辑运算符(8、9、10、11、12)的优先级低于任何一个关系运算符(6、7)。

6、移位运算符(5)的优先级比算术运算符(3、4)低,比关系运算符(6、7)高。


关于前自增/减和后自增/减优先级示例:


可根据运算符优先级和汇编代码自行分析,熟练掌握相关技巧,必要时记忆。

读书人网 >C语言

热点推荐