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

關於c說話的一個小bug詳解

編輯:關於C++

關於c說話的一個小bug詳解。本站提示廣大學習愛好者:(關於c說話的一個小bug詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是關於c說話的一個小bug詳解正文


不多說,說了都是包袱!直接看代碼吧!

<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;
}
</SPAN>

有興致的可以先猜猜成果是啥,然後再運轉下,看看成果是否是和本身想的一樣? 個中的事理又是甚麼呢?

gcc 下如行成果以下:

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


<SPAN >
TOTAL_ELEMENTS </SPAN>

所界說的值是unsigned int 類型(由於sizeof()前往類型是無符號的),if 語句在有符號和無符號之間測試相等性,所以將

d進級為無符號(unsigned int )類型,-1轉換成 unsigned int 的成果是一個異常偉大的正整數的,導致表達式為假,

所以要想成果准確,先得強轉類型

<SPAN >if( d <=   (int)(TOTAL_ELEMENTS -2))
</SPAN>

如許就可以獲得准確的成果啦!

對無符號的建議;
1 盡可能不要在代碼中應用無符號類型,以避免增長不用要的龐雜性,特別是僅僅由於無符號數不存在負值而用它來表現

2 盡可能應用int如許有符號類型,如許在觸及進級混雜類型的龐雜細節時,不用擔憂界限情形(-1 翻譯成異常年夜的整數)

3 只要在應用位段和二進制掩碼時,才應用無符號數。並且應當在表達式中應用強迫類型轉換,使操作數均為有符號數或許無符號數,如許不用由編譯器來選擇成果的類型。

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