型別強制轉換符 與 符的優先順序

2022-08-30 17:03:13 字數 1032 閱讀 2515

移植 gcc **到 vs2008 時,犯了乙個關於型別強制轉換符 與 + 符的優先順序錯誤。

共有的示例**如下(也就是問題的條件):

1

char carraytest[10

];

2 unsigned short *pustest =null;

3 unsigned short *pustest2 =null; 45

for(int i = 0;i < 10;i++)

6{

7 carraytest[i] = i + 1;

gcc 的原始**如下示例:

1 pustest =carraytest;  

2 pustest2 = carraytest + 2;

c 編譯器對下面的兩句可以正常編譯。

vs2008 的編譯器會報錯,必須強制型別轉換。

當時也未多考慮,直接在前面增加了強制型別轉換符,修改後的**如下:

1 pustest = (unsigned short *)carraytest;  

2 pustest2 = (unsigned short *)carraytest + 2;

本來是 pustest2 想取 carraytest 的第三和第四個位元組來組成乙個 unsigned short 的數值。

但實際上上面的** pustest2 取得的是 carraytest 的第 5 和第 6 個位元組所組成的 unsigned short 的數值。

由於 pustest2 在後繼的使用時比較隱蔽,**又無法除錯,所以導致出錯問題後很久未發現問題的原因。

最後才懷疑到此句:

1 pustest2 = (unsigned short *)carraytest + 2;

查了一下,強制型別轉換或的優先順序果然高於 + 符。

1 pustest2 = (unsigned short *)(carraytest + 2);

才是想要的結果。

強制型別轉換運算子的優先順序

int i 10 char b 20 如 i b 這樣賦值沒有問題,因為低位元組型別轉換成高位元組型別。如果是b i 這樣會有問題,b char i 因為高字型轉換為低位元組的型別後,若int i當前數值超過127時,會導致溢位,資料缺失。所以。如果高位元組型別要強制轉換為低位元組型別時,要考慮溢位...

型別轉換和算符優先順序

答案 47 解析 b a 2 計算時需要先把a轉換為整型,然後再與2相乘,計算出結果的後8位再賦給b。編輯器只所以這樣做,主要是適應各種型別的資料,而計算結果的正確與否,是否越界,是程式設計師的事情。unsigned char是無符號位元組型,char型別變數的大小通常為1個位元組 1位元組 8個位...

運算子與優先順序

除常規運算外,需注意 1.若兩個運算元都是整數型別,那麼結果也是整數型別,且不允許除數為0,結果為 x 若兩個運算元中,至少有乙個為浮點型別,那麼結果也為浮點數,允許除0或0.0 2.如果兩個 運算元都是整數,這第二個運算元不能是0,若至少有乙個運算元為浮點數,則允許第二個運算元為0或者0.0,結果...