#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比較,就能避免了這種意想不到的錯誤。