一個謎語(在C中)一位朋友給了我一個謎語:#include<stdio.h>#define TOTAL_ELEMENTS ((sizeof(array) / sizeof(array[0])))
int array[] = {23,34,12,17,204,99,16};
int main()
{
int d;
for(d=-1;d <= (TOTAL_ELEMENTS-2);d++)
printf("%d\n",array[d+1]);
getchar();
return 0;
}上面的代碼應(yīng)該打印所有的數(shù)組元素,代碼中的問題是什么(輸出什么都沒有)?我認(rèn)為循環(huán)不會迭代一次?我發(fā)現(xiàn)以下代碼確實有效:#include<stdio.h>#define TOTAL_ELEMENTS ((sizeof(array) / sizeof(array[0])))
int array[] = {23,34,12,17,204,99,16};
int main()
{
int d;
int x = (TOTAL_ELEMENTS-2);
for(d=-1;d <= x;d++)
printf("%d\n",array[d+1]);
getchar();
return 0;
}我有一個理論認(rèn)為它與宏有關(guān),但我不能指責(zé)問題。
3 回答

喵喵時光機
TA貢獻1846條經(jīng)驗 獲得超7個贊
問題是這(TOTAL_ELEMENTS-2)
是一個無符號值。進行比較時d <= (TOTAL_ELEMENTS-2)
,兩個值都將轉(zhuǎn)換為無符號值,結(jié)果為false。
在你的第二個例子中,x
簽名所以沒有問題。

白板的微信
TA貢獻1883條經(jīng)驗 獲得超3個贊
的sizeof
操作者產(chǎn)生類型的結(jié)果size_t
。在第一個版本中,您將int
(簽名)與size_t
(未簽名)進行比較。
在第二個版本中,通過賦值將size_t
表達式轉(zhuǎn)換為a int
,因此比較的兩個操作數(shù)具有相同的類型。

慕容3067478
TA貢獻1773條經(jīng)驗 獲得超3個贊
另一種看待這個問題的方法如下
#include<stdio.h>int main() {int i = -5;unsigned int j = 6;if(i < j) printf("-5 is less than 6");else printf("-5 is greater than 6");return 0;}
輸出是:
-5 is greater than 6
原因: 將無符號整數(shù)與有符號整數(shù)進行比較將始終返回false。
在提問者的情況下, sizeof返回無符號數(shù)據(jù)類型,但它與簽名數(shù)據(jù)類型進行比較( - 是一個錯誤)
- 3 回答
- 0 關(guān)注
- 446 瀏覽
添加回答
舉報
0/150
提交
取消