程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> 關於c語言的一個小bug(c專家編程)

關於c語言的一個小bug(c專家編程)

編輯:關於C

[cpp]

print?<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> 

#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;
}

 

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

 


gcc 下如行結果如下:


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

zy@pc:~/workspace/homework/commonfunc$ ./a.out
the bug is out!


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


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

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

所以要想結果正確,先得強轉類型


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

if( d <=   (int)(TOTAL_ELEMENTS -2))
 這樣就能得到正確的結果啦!

 


對無符號的建議;

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

2 盡量使用int這樣有符號類型,這樣在涉及升級混合類型的復雜細節時,不必擔心邊界情況(-1 翻譯成非常大的整數)

3 只有在使用位段和二進制掩碼時,才使用無符號數。而且應該在表達式中使用強制類型轉換,使操作數均為

   有符號數或者無符號數,這樣不必由編譯器來選擇結果的類型。

 

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved