在学习或者使用C语言时,准确辨别运算符的优先级大小,对能否编写和运行正确的程序至关重要。相信,不管是初学者还是程序老兵,都在C语言运算符的优先级问题上栽倒过。下面贴出C语言运算符优先级的排序表。(参考:cppreference.com)
从上面的优先级排序表可以看出,优先级最高的是数组下标、函数调用操作符、结构体成员选择符。在一些复杂的开源程序中,可以看到一些代码块,例如*p->pdata++,这种写法等价于(1)先取结构体的成员值,即p->pdata,(2)然后再自增自减,(p->pdata)++,(3)最后再进行取值运算*((p->pdata)++)。
易错项分析
1、*P.num :“.” 的优先级(1)高于 “*” 的优先级(2),故含义是:*(P.num) 对P取num的偏移,然后对num进行解引用操作;易错:(*P).num 对P进行解引用,然后取该对象的num字段。
2、int *array [ ] :"[ ]" 的优先级(1)高于 “*” 的优先级(2),故含义是:int * (array [ ]) array是个数组,数据由int指针组成;易错:int (*array) [ ] array是个指向int数组的指针。
3、int * func( ) :“( )” 的优先级(1)高于 “*” 的优先级(2),故含义是:int *(func( )) func是个返回int指针的函数;易错:int (*func) ( ) func是个函数指针,其指向的函数返回值为int类型。
4、( num & mask != 0 ) :“!=” 的优先级(7)高于 “&” 的优先级(8),故含义是:( num & (mask != 0) ); 易错:( (num & mask) != 0 ) 。
5、( result = func() != 0 ) :因为 “!=” 的优先级(7)高于 "=" 的优先级(14),故含义是:( result = (func() != 0) ) ;易错:( (result = func()) != 0 ) 。
6、num << 5 + result :因为算数运算符的优先级高于移位运算符,故含义是:num << (5 + result) ;易错:(num << 5) + result。
7、num = 3 , 5 :虽然逗号运算符的值是最右边操作数的值,但是逗号运算符的优先级最低,这里 “=” 的优先级较高,故含义是:(num = 3) , 5;易错: num = ( 3, 5 ) 。