写这个博客,为了记录自己在实际开发中因为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语言的运算符优先级,其实养成一个 只要有运算就加上括号的好习惯,管它什么优先级呢。