|
本帖最后由 逍遥派掌门人 于 2013-7-15 15:23 编辑
Lazarus 程序片段:- var a1,a2,a3:byte;
- begin
- a1:=$31;
- a2:=(a1 shr 4 ) and $0F * 10 + a1 and $0F;
- a3:=a1 shr 4 and $0F * 10 + a1 and $0F;
- showmessage(inttostr(a2)+'---'+inttostr(a3));
复制代码 结果显示 a2=31, a3=31 ,均为预期的结果,正确。
然而,将上面的代码直接翻译为C语言的代码时,问题出来了:- unsigned char a1,a2,a3;
- a1=0x31;
- a2=(a1 >>4 ) & 0x0F *10 + a1 & 0x0F;
- a3=a1 >> 4 & 0x0F *10 + a1 &0x0F;
复制代码 得到的结果: a2=3 ,a3=3 ,很显然,不是所期望得到的结果。
为什么会这样呢? 答案是:运算符的优先级。
在Pascal语言里面: 运算符 * , shr ,and 的优先级是相同的,遵循从左到右的优先规则, 运算符 + 的优先级则相对最低;
在C语言里:运算符 * 优先级最高,接着是运算符 +,再接着是 运算符>>,最低是运算符 &。
由于上述的差别,导致了无法得到正确的结果。
正确的C语言代码为:- unsigned char a1,a2;
-
- a1=0x31;
- a2=((a2 >>4 ) & 0x0F) * 10 + (a2 & 0x0F);
复制代码 用C语言例优先级最高的圆括号来强制实现Pascal语言的优先级顺序,从而得到期望的值: a2=31 。
不同的语言,运算符的优先级可能会有不同,在转换代码的时候要特别注意,以免得不到正确的结果。
|
|