關於c語言的乙個小bug(c專家程式設計)

2021-08-27 14:26:05 字數 927 閱讀 5226

不多說,說了都是累贅!直接看**吧!

#include int array = ;

#define total_elements (sizeof(array)/sizeof(array[0]))

int main (void)

else

return 0;

}

有興趣的可以先猜猜結果是啥,然後再執行下,看看結果是不是和自己想的一樣? 其中的道理又是什麼呢?

gcc 下如行結果如下:

zy@pc:~/workspace/homework/commonfunc$ ./a.out 

the bug is out!

total_elements
所定義的值是unsigned int 型別(因為sizeof()返回型別是無符號的),if 語句在有符號和無符號之間測試相等性,所以將

d公升級為無符號(unsigned int )型別,-1轉換成 unsigned int 的結果是乙個非常巨大的正整數的,致使表示式為假,

所以要想結果正確,先得強轉型別

if( d <=   (int)(total_elements -2))

這樣就能得到正確的結果啦!

對無符號的建議;

1 盡量不要在**中使用無符號型別,以免增加不必要的複雜性,尤其是僅僅因為無符號數不存在負值而用它來表示

2 盡量使用int這樣有符號型別,這樣在涉及公升級混合型別的複雜細節時,不必擔心邊界情況(-1 翻譯成非常大的整數)

3 只有在使用位段和二進位制掩碼時,才使用無符號數。而且應該在表示式中使用強制型別轉換,使運算元均為

有符號數或者無符號數,這樣不必由編譯器來選擇結果的型別。

關於c語言的乙個小bug(c專家程式設計)

不多說,說了都是累贅!直接看 吧!include int array define total elements sizeof array sizeof array 0 int main void else return 0 有興趣的可以先猜猜結果是啥,然後再執行下,看看結果是不是和自己想的一樣?其...

記乙個關於C語言函式指標使用的小例子

首先回顧函式指標的宣告方式 以乙個返回值為空的有乙個int型別引數的函式指標為例 void func int 函式 void func int 函式指標 void func 5 int 函式指標的陣列下面兩份 給出乙個返回值為函式指標的函式的例子,演示宣告該類函式的兩種不同方式,以及函式指標的使用。...

乙個關於博士的小故事

下面是我看到的乙個小故事,也許已經很舊了,但是很有教育意義,覺得不錯就發上來了。有乙個博士分到一家研究所,成為學歷最高的乙個人。有一天他到單位後面的小池塘去釣魚,正好正副所長在他的一左一右,也在釣魚。他只是微微點了點頭,這兩個本科生,有啥好聊的呢?不一會兒,正所長放下釣竿,伸伸懶腰,蹭蹭蹭從水面上如...