当前位置: 代码迷 >> 综合 >> C/CAPL 语言中 位或(|),加号(+),移位(<<)运算符的优先级
  详细解决方案

C/CAPL 语言中 位或(|),加号(+),移位(<<)运算符的优先级

热度:52   发布时间:2023-09-20 13:53:16.0

写这个博客,为了记录自己在实际开发中因为C语言的运算符模糊不清,犯的一个错误

需求:
有三个long 型变量,a = 0x11 ,b =0x22, c =0x33 ,我想 实现 d = 0x112233

以下脚本基于CAPL脚本。
错误的代码:

On key 'c'
{
    long  a,b,c,d;a=0x11;b=0x22;c=0x33;d = a <<16 + b <<8 + c ;write("a:0x%x",a);write("b:0x%x",b);write("c:0x%x",c);write("d:0x%x",d); 
}

上面代码实际输出的是 0x00,因为 “<< ”的 优先级小于 “+”的优先级 ,所以 最后 d = a << (16+0x22)<<(8+0x33) 。

正确的代码:

On key 'c'
{
    long  a,b,c,d;a=0x11;b=0x22;c=0x33;d =( a <<16 )+ (b <<8 )+ c ;write("a:0x%x",a);write("b:0x%x",b);write("c:0x%x",c);write("d:0x%x",d); 
}

另外一种正确的方式:

On key 'c'
{
    long  a,b,c,d;a=0x11;b=0x22;c=0x33;d = a <<16 | b <<8 | c ;write("a:0x%x",a);write("b:0x%x",b);write("c:0x%x",c);write("d:0x%x",d); 
}

因为 “|”的运算符优先级是小于 “<<”运算符的,故这种方式也可以得到正确的结果。

下图附上C语言的运算符优先级,其实养成一个 只要有运算就加上括号的好习惯,管它什么优先级呢。
C/CAPL 语言中 位或(|),加号(+),移位(<<)运算符的优先级