關於乙個c語言中的小陷阱(資料型別之間的轉換)

2021-06-20 17:41:28 字數 636 閱讀 3057

在周師兄處看到這樣一小段**:

#include#define total_elements (sizeof(array) / sizeof(array[0]))

int array = ;

int main()

當時雖然覺得有點奇怪,不過也自以為沒什麼可看的,輸出乙個陣列麼。

不過一執行,就坑爹了-------控制台裡一行輸出都沒有!!什麼情況。。。

後來搞了半天,總算弄清楚了:sizeof()運算子返回的資料型別為unsinged int,而d為int。當int 與 unsigned int進行運算時,int會自動轉換成unsigned int,而d為32位,-1的int型為全1。當d轉換成unsigned後,d就變成了乙個很大的數,為2^32-1.如此一來,在for語句的<=判斷時,d自然大於(total_elements-2)。後者僅僅等於5.所以for迴圈的第1次條件判斷就沒有通過,自然就進不了迴圈體了。

可以這樣改:

for(d=-1;d <= (int)(total_elements-2);d++)

printf("%d\n",array[d+1]);

在運算之前將後者強制轉換為int型。

乙個PHP語言的小陷阱

直接上 吧 class a class b extends a obj new b obj showname 大家猜猜看,程式輸出的是a還是b?如果你堅定地回答 a 那麼下面的內容就不用看了 如果你回答的是b,或者不確定,則有必要繼續看下去。首先給出正確答案 a。原因分析 在b的建構函式中,由於 n...

while的乙個小陷阱

先看一段 示例 pragma warning disable 4996 include copy.h char mystrcpy char desc,const char src 為了讓 看起來更加的簡潔美觀,我一直喜歡這樣寫while,而且也沒出過什麼問題。但是這樣寫是否存在問題,看一下下面這個示...

0xde c語言合法常量 C語言的乙個小陷阱

其實說的就是定義問題,圖中看不清楚的,可以看下面 部分 define limit 20 const int lim 50 static int data1 limit 合法 static int data2 lim 無效 const int lim2 2 limit 合法 const int lim...