C語言有符號整數隱式轉換無符號整數出現的陷阱

#include <stdio.h>
#include <string.h>
int main()
{
    char *s = "rt";   //長度爲2 
    char *t = "tyr";   //長度爲3 
    printf("%d\n", strlen(s)-strlen(t)>0);     //1 
    printf("%d\n", (int)(strlen(s)-strlen(t))>0);  //0
    return 0;
}
該程序意思是比較字符串數組s和字符串數組t的長度大小。按我們的理解,在第7行應該返回false,即輸出0。
c語言執行運算時,如果它的一個運算數是無符號的,而另一個是有符號的,那麼c語言會隱式的將有符號參數強制類型轉換爲無符號數,並假設這兩個數都是非負的,來執行則會個運算。
再看這個程序,第7行輸出1的原因是由於函數size_t  strlen(const char *s) 的返回類型是size_t,查看stdio.h可知size_t是無符號整形,當 s數組長度比t數組長度小1時,判斷式表示比較-1u>0。首先-1會轉換爲無符號整形,即4294967295,顯然大於0。所以 這時候比較完之後返回爲true,輸出爲1。我們可以對 strlen(s)-strlen(t),進行強制轉換爲一般整形數,再與0比較,就能避免了這種意想不到的錯誤。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章