假设存在一个已定义的常量 FLAG, FLAG 是一个整数, 且该整数值的二进制表示中只有某一位是1,其余各位均为0, 亦即该整数是2的某次幂。如果对于整型变量 flags,我们需要判断它在常量FLAG 为1的那一位上是否同样也为1
通常可以这样写:
if ( flags & FLAG) …
上式的含义对大多数C程序员来说是显而易见的:
if语句判断括号内表达式的值是否为 0。
考虑到可读性, 如果对表达式的值是否为 0 的判断能够显式地加以说明,无疑使得代码自身就起到了注释该段代码意图的作用。
其写法如下,
if ( flags & FLAG != 0) …
这个语句现在虽然更好懂了, 但却是一个错误的语句。
因为!=运算符的优先级要高于 & 运算符,
所以上式实际上被解释为: if ( flags & (FLAG != 0) ) ...
因此,除了 FLAG恰好为1的情形,FLAG 为其他数时这个式子都是错误的。
又假设 hi 和 low 是两个整数, 它们的值介于0到15 之间, 如果r是一个 8位整数, 且r的低4位与 low 各位上的数一致,而r的高4位与 hi各位上的数一致。
很自然会想到要这样写:
r = hi<<4 + low;
但是很不幸,这样写是错误的。
加法运算的优先级要比移位运算的优先级高,
因此本例实际上相当于:
r=hi<<(4+1ow);
对于这种情况, 有两种更正方法:
第一种方法是加括号;
第二种方法意识到问题出在程序员混淆了算术运算与逻辑运算, 但这种方法牵涉到的移位运算与逻辑运算的相对优先级就更加不是那么明显。
两种方法如下:
r=(hi<<4)+1ow;//法1:
加括号r=hi<<4|log;//法2:
将原来的加号改为按位逻辑或用添加括号的方法虽然可以完全避免这类问题, 但是表达式中有了太多的括号反而不容易理解。
因此, 记住C语言中运算符的优先级是有益的。
完整内容给大家准备好了,可以复制下方链接到夸克打开
链接:https://pan.quark.cn/s/6b3d6182abde
另外给大家准备了75本关于C语言的电子版,全都是评分很高的经典书,需要的可以自己保存
链接:https://pan.quark.cn/s/e17a027c4f57