2017-02-18 71 views
0

以下代碼打印沒有類似的C程序:2與宏產生不同的輸出

#include<stdio.h> 
#define TOTAL_SIZE ((sizeof(array))/(sizeof(array[0]))) 
int main() 
{ 
    int array[]={1,2,3}, d; 
    for(d=-1; d<=TOTAL_SIZE-2; ++d) 
    { 
     printf("%d\n", array[d+1]); 
    } 
    return 0; 
} 

d = -1 < = 3-2
打印陣列[-1 + 1],這是陣列[0]
d = 0 < = 3-2
打印陣列[0 + 1],這是陣列[1]
d = 1 < = 3-2
打印陣列[1 + 1],這是陣列[2]

但是甚至沒有打印單個元素!



但這個代碼產生打印數組中的所有元素的右輸出:

#include<stdio.h> 
#define TOTAL_SIZE ((sizeof(array))/(sizeof(array[0]))) 
int main() 
{ 
    int array[]={1,2,3}, d; 
    for(d=0; d<=TOTAL_SIZE-1; ++d) 
    { 
     printf("%d\n", array[d]); 
    } 
    return 0; 
} 

然而無論是循環的淨效應似乎是相同的。

如果我們用數組中元素的個數替換宏TOTAL_SIZE,它就可以工作。所以這個問題似乎與宏有關。

但是當我嘗試打印由TOTAL_SIZE生成的值時,它會打印出正確的值。

第一個程序有什麼問題?

+4

啓用所有警告並將它們視爲錯誤。這是保持理智的唯一方法。對於海灣合作委員會和鏗鏘,這是' - 牆 - 外部 - W- - 恐怖'。 –

回答

8

與宏的問題是,sizeof返回size_t這是您要比較的無符號整數簽署型int。解決方案是將您的大小投射到int

#define TOTAL_SIZE (int)((sizeof(array))/(sizeof(array[0])))

+2

Nitpick,它返回'size_t',它是一個實現定義的無符號整數類型,但不一定是**'unsigned int'類型。 – StoryTeller

+0

是的,但size_t是* unsigned *。謝謝你的更正:) – Micha

+0

所以我的問題是比較d(它是一個有符號的數字,即-1)的初始值與sizeof返回的size_t的初始值。感謝您的幫助。 –