在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/C/ 為什么這兩段C代碼輸出的結(jié)果會不一樣?

為什么這兩段C代碼輸出的結(jié)果會不一樣?

這里有一段C代碼:

int array[] = {1,2,3,4,5,6,7};
#define LEN (sizeof(array) / sizeof(array[0]))

int main(void) {
    
    int i, sum = 0;
    
    for (i = 0; i < LEN; i++) {
        sum += array[i];
    }
    printf("%d\n", sum);
    return 0;
}

輸出結(jié)果是28,可是如果把上面的for循環(huán)改成下面這樣:

for (i = -1; i < LEN - 1; i++) {
        sum += array[i + 1];
}

結(jié)果就成了0.我用gdb運行了一下,發(fā)現(xiàn)第二種寫法根本沒進for循環(huán),直接執(zhí)行了后面的打印。

請問為什么會這樣呢?

回答
編輯回答
風畔

因為類型轉(zhuǎn)換, 在這個表達式i < LEN - 1中, LEN - 1將被宏擴展為,(sizeof(array) / sizeof(array[0])) -1.
這個表達式的類型是,long unsigned int,所以在表達式i < LEN - 1中的i-1類型轉(zhuǎn)換為long unsigned int成為2^n-1(n與系統(tǒng)有關(guān))大于6,所以沒有執(zhí)行.

for循環(huán)中不要使用無符號整數(shù), 否則負數(shù)會轉(zhuǎn)換成無符號數(shù),導(dǎo)致循環(huán)條件出問題.

2017年1月26日 17:56