類型強(qiáng)制轉(zhuǎn)換符 與 + 符的優(yōu)先級
移植 gcc 代碼到 VS2008 時,犯了一個關(guān)于類型強(qiáng)制轉(zhuǎn)換符 與 + 符的優(yōu)先級錯誤。
共有的示例代碼如下(也就是問題的條件):
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 的編譯器會報錯,必須強(qiáng)制類型轉(zhuǎn)換。
當(dāng)時也未多考慮,直接在前面增加了強(qiáng)制類型轉(zhuǎn)換符,修改后的代碼如下:
pusTest?=?(unsigned?short?*)cArrayTest; pusTest2?=?(unsigned?short?*)cArrayTest?+?2;
本來是 pusTest2 想取 cArrayTest 的第三和第四個字節(jié)來組成一個 unsigned short 的數(shù)值。
但實(shí)際上上面的代碼 pusTest2 取得的是 cArrayTest 的第 5 和第 6 個字節(jié)所組成的 unsigned short 的數(shù)值。
由于 pusTest2 在后繼的使用時比較隱蔽,代碼又無法調(diào)試,所以導(dǎo)致出錯問題后很久未發(fā)現(xiàn)問題的原因。
最后才懷疑到此句:
pusTest2?=?(unsigned?short?*)cArrayTest?+?2;
查了一下,強(qiáng)制類型轉(zhuǎn)換或的優(yōu)先級果然高于 + 符。
pusTest2?=?(unsigned?short?*)(cArrayTest?+?2);
才是想要的結(jié)果。