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