国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C > 正文

淺析個C語言的一個小bug

2020-02-24 14:33:21
字體:
來源:轉載
供稿:網友

如果你對C語言還不是很了解,那么今天武林技術小編就給同學們附上這篇淺析個C語言的一個小bug,好啦,閑話不多說,說多了都是累贅!直接看代碼吧!

復制代碼 代碼如下:

#include
int array[] = {23, 34, 12, 17, 204, 99, 16};
#define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0]))
int main (void)
{
int d = -1, x;
if( d <= (TOTAL_ELEMENTS -2))
{
x = array[d+1];
printf("d <= TOTAL_ELEMENTS-2/n");
}
else
{
printf("the bug is out!/n");
}
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就講完了。如果有什么不清楚可以留言給我。如果覺得我寫得不錯的話,請給我一個大拇指,謝謝!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 天等县| 华安县| 明光市| 包头市| 泽州县| 宜州市| 台北市| 仙游县| 开原市| 瑞金市| 舒兰市| 万安县| 油尖旺区| 湖口县| 阿拉善右旗| 鲁山县| 阜阳市| 宁陵县| 新竹县| 进贤县| 和龙市| 宜良县| 泰安市| 建水县| 介休市| 岑巩县| 金昌市| 达尔| 达孜县| 永川市| 盐边县| 繁峙县| 科技| 稻城县| 盱眙县| 上高县| 绥芬河市| 陇西县| 镇宁| 贵南县| 左贡县|