不多說,說了都是累贅!直接看**吧!
#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 函式指標的陣列下面兩份 給出乙個返回值為函式指標的函式的例子,演示宣告該類函式的兩種不同方式,以及函式指標的使用。...
乙個關於博士的小故事
下面是我看到的乙個小故事,也許已經很舊了,但是很有教育意義,覺得不錯就發上來了。有乙個博士分到一家研究所,成為學歷最高的乙個人。有一天他到單位後面的小池塘去釣魚,正好正副所長在他的一左一右,也在釣魚。他只是微微點了點頭,這兩個本科生,有啥好聊的呢?不一會兒,正所長放下釣竿,伸伸懶腰,蹭蹭蹭從水面上如...