#include <stdio.h>
#include <string.h>
int main() {
char s[100];
scanf("%s", s);
if (-1 >= strlen(s)) printf("true\n");
return 0;
}
輸入任意字符串,竟輸出 "true"。
strlen 返回類型為 size_t,在多數編譯器中定義為 unsigned int 或 unsigned long。表達式 -1 >= strlen(s) 中,-1 會被隱式轉換為無符號數(極大值 0xFFFFFFFF / 0xFFFFFFFFFFFFFFFF),導致條件恒為真。
// 方案一:顯式轉換為有符號數
if ((int)strlen(s) <= -1) ... // 但 strlen 非負,此判斷無意義
// 方案二:避免與負數比較
if (strlen(s) == 0) ... // 判斷空字符串
// 方案三:使用 int 變量接收
int len = (int)strlen(s);
if (len < 0) ... // 永不成立
-Wsign-compare)可提前發現此類問題。