曾经以为不需要记住C语言的操作符的优先级,但是现在发现加括号实在是太烦了,还是试着记吧。
举例:
常见错误1: if (flags & FLAG != 0) ...
解析:!= 比&有更高优先级,相当于if (flags & (FLAG != 0))
常见错误2:r = h<<1 + 2
解析:+比<<有更高优先级,相当于 r = h<<(1+2)
常见错误3: while ( c = getc(in) != EOF)
解析:赋值运算符优先级最低,相当于 while ( c = (getc(in) != EOF))
总结:
C语言有15个操作符优先级,而且每个操作符还有不同的结合型,所以必须要分类记忆。以下从上到下,从左至右优先级由高到低:
第一级,下标操作符[],函数调用(),结构体运算符->与.。结合型为左到右
第二级,一元操作符,包括逻辑非!,按位取反~,自增/自减操作符++/--,负号运算符-,类型转换,指针*,取地址&,sizeof。结合性为右到左
第三级,二元操作符,包括加减乘除,左移右移操作符<</>>,关系运算符</>/<=/>=,等于不等于=/!=,然后是
按位与&, 按位异或^,按位或|,最后是逻辑与,逻辑或,条件运算符。除条件运算符外,结合性都为左到右
第四级,所有的赋值运算符,逗号运算符。赋值结合性为左到右,逗号运算符为右到左。