a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C > 正文

淺析個(gè)C語言的一個(gè)小bug

2020-02-24 14:33:21
字體:
供稿:網(wǎng)友

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

復(fù)制代碼 代碼如下:

#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;
}


有興趣的可以先猜猜結(jié)果是啥,然后再運(yùn)行下,看看結(jié)果是不是和自己想的一樣? 其中的道理又是什么呢?

gcc 下如行結(jié)果如下:

復(fù)制代碼 代碼如下:


zy@pc:~/workspace/homework/commonfunc$ ./a.out
the bug is out!

復(fù)制代碼 代碼如下:



TOTAL_ELEMENTS


所定義的值是unsigned int 類型(因?yàn)閟izeof()返回類型是無符號(hào)的),if 語句在有符號(hào)和無符號(hào)之間測(cè)試相等性,所以將

d升級(jí)為無符號(hào)(unsigned int )類型,-1轉(zhuǎn)換成 unsigned int 的結(jié)果是一個(gè)非常巨大的正整數(shù)的,致使表達(dá)式為假,

所以要想結(jié)果正確,先得強(qiáng)轉(zhuǎn)類型

復(fù)制代碼 代碼如下:

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


這樣就能得到正確的結(jié)果啦!

對(duì)無符號(hào)的建議;
1 盡量不要在代碼中使用無符號(hào)類型,以免增加不必要的復(fù)雜性,尤其是僅僅因?yàn)闊o符號(hào)數(shù)不存在負(fù)值而用它來表示

2 盡量使用int這樣有符號(hào)類型,這樣在涉及升級(jí)混合類型的復(fù)雜細(xì)節(jié)時(shí),不必?fù)?dān)心邊界情況(-1 翻譯成非常大的整數(shù))

3 只有在使用位段和二進(jìn)制掩碼時(shí),才使用無符號(hào)數(shù)。而且應(yīng)該在表達(dá)式中使用強(qiáng)制類型轉(zhuǎn)換,使操作數(shù)均為有符號(hào)數(shù)或者無符號(hào)數(shù),這樣不必由編譯器來選擇結(jié)果的類型。

到這里,淺析個(gè)C語言的一個(gè)小bug就講完了。如果有什么不清楚可以留言給我。如果覺得我寫得不錯(cuò)的話,請(qǐng)給我一個(gè)大拇指,謝謝!

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 成人黄视频在线观看 | 天天天操操操 | 国产精品视频网站 | 久久国产经典视频 | 亚洲六月丁香色婷婷综合久久 | 在线不卡视频 | 久久国产精品免费视频 | 国产精品99久久久久久动医院 | 自拍视频在线观看免费 | 夜夜爆操 | 四季久久免费一区二区三区四区 | www.麻豆| 国产一区二区三区视频在线观看 | 8x国产精品视频一区二区 | 日韩精品专区在线影院重磅 | 狠狠色视频 | 日韩成人av在线播放 | 啪啪小视频网站 | 成人av电影免费在线观看 | 国产精品一区在线 | 成人免费视频一区 | 一区二区中文字幕 | 久久高清亚洲 | 国产免费视频一区二区三区 | 午夜精品美女久久久久av福利 | 天天天色| 亚洲国产精品免费 | 3bmm在线观看视频免费 | 久久久久九九九九 | 久久久精品日本 | 日韩99 | 神马久久久久久久久久 | av网站在线免费看 | 亚洲男人天堂2023 | 九九热精品免费视频 | 亚洲+变态+欧美+另类+精品 | 欧美极品视频 | 免费av在线网站 | 九草在线| 精品国产31久久久久久 | 欧产日产国产精品一二 |