先看下文代碼:
#include <stdio.h>
int aaa[]={1,2,3,4};
#define TOTALELEMENT (sizeof(aaa)/sizeof(aaa[0]))
int main()
{
int d=-1;
if(d<=TOTALELEMENT) printf("d<=TOTALELEMENT!\n");
else printf("d>TOTALELEMENT!\n");
return 0;
}
各位覺得輸出結果應該是什么?輸出結果如下:
d>TOTALELEMENT!
如果不相信的話可以自行復制代碼執(zhí)行測試,該Bug產生的原因在于,sizeof的返回值是unsigned類型烦秩。由于ANSI C的算數轉換漏洞府喳,在進行算數比較時圾叼,編譯器會將d的int型默認轉換成unsigned int比較纽疟,導致-1變成一個非常大的正數,結果就是"d>TOTALELEMENT!\n"奋早。如果需要得到正確結果盛霎,只需在TOTALELEMENT加一個強制類型轉換即可:
#include <stdio.h>
int aaa[]={1,2,3,4};
#define TOTALELEMENT (sizeof(aaa)/sizeof(aaa[0]))
int main()
{
int d=-1;
if(d<=(int)TOTALELEMENT) printf("d<=TOTALELEMENT!\n");
else printf("d>TOTALELEMENT!\n");
return 0;
}