类型强制转换符 与 + 符的优先级
扫描二维码
随时随地手机看文章
移植 gcc 代码到 VS2008 时,犯了一个关于类型强制转换符 与 + 符的优先级错误。
共有的示例代码如下(也就是问题的条件):
char cArrayTest[10]; unsigned short *pusTest = NULL; unsigned short *pusTest2 = NULL; for(int i = 0;i < 10;i++) { cArrayTest[i] = i + 1;
gcc 的原始代码如下示例:
pusTest = cArrayTest; pusTest2 = cArrayTest + 2;
C 编译器对下面的两句可以正常编译。
VS2008 的编译器会报错,必须强制类型转换。
当时也未多考虑,直接在前面增加了强制类型转换符,修改后的代码如下:
pusTest = (unsigned short *)cArrayTest; pusTest2 = (unsigned short *)cArrayTest + 2;
本来是 pusTest2 想取 cArrayTest 的第三和第四个字节来组成一个 unsigned short 的数值。
但实际上上面的代码 pusTest2 取得的是 cArrayTest 的第 5 和第 6 个字节所组成的 unsigned short 的数值。
由于 pusTest2 在后继的使用时比较隐蔽,代码又无法调试,所以导致出错问题后很久未发现问题的原因。
最后才怀疑到此句:
pusTest2 = (unsigned short *)cArrayTest + 2;
查了一下,强制类型转换或的优先级果然高于 + 符。
pusTest2 = (unsigned short *)(cArrayTest + 2);
才是想要的结果。