欧美大屁股bbbbxxxx,狼人大香伊蕉国产www亚洲,男ji大巴进入女人的视频小说,男人把ji大巴放进女人免费视频,免费情侣作爱视频

歡迎來到入門教程網(wǎng)!

C語言

當(dāng)前位置:主頁 > 軟件編程 > C語言 >

關(guān)于c語言的一個小bug詳解

來源:本站原創(chuàng)|時間:2020-01-10|欄目:C語言|點擊: 次

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

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

<SPAN style="FONT-SIZE: 14px">#include <stdio.h>
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;
}
</SPAN>

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

gcc 下如行結(jié)果如下:
復(fù)制代碼 代碼如下:

<SPAN style="FONT-SIZE: 14px">zy@pc:~/workspace/homework/commonfunc$ ./a.out
the bug is out!
</SPAN>

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

<SPAN style="FONT-SIZE: 14px">
TOTAL_ELEMENTS </SPAN>

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

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

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

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

<SPAN style="FONT-SIZE: 14px">if( d <=   (int)(TOTAL_ELEMENTS -2))
</SPAN>

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

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

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

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

上一篇:C語言中堆空間的生成與釋放詳解

欄    目:C語言

下一篇:深入解析unsigned int 和 int

本文標(biāo)題:關(guān)于c語言的一個小bug詳解

本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/4235.html

網(wǎng)頁制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語言數(shù)據(jù)庫服務(wù)器

如果侵犯了您的權(quán)利,請與我們聯(lián)系,我們將在24小時內(nèi)進(jìn)行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有