LeetCode 第 6 題「Z 字形變換」實作中,條件判斷 if((k*num+i*x) >= s.size()) 在明明應為 false 時卻進入了 if 區塊,導致邏輯錯誤。
// s.size() 回傳 size_t (unsigned long long)
// k*num+i*x 為 int (可能為負數)
if ((k*num+i*x) >= s.size()) // 危險!負數轉 unsigned 變極大正數
s.size() 回傳 size_t(無號整數,通常 64 位)k*num+i*x 計算結果為 int(有號,可能為 -1)int 隱式轉換為 size_t-1 轉 size_t 變成 18446744073709551615 (2^64-1)巨大數值 >= 14 → trueif ((k*num+i*x) >= (int)s.size())
int len = (int)s.size();
if ((k*num+i*x) >= len)
int idx = k*num + i*x;
if (idx < 0 || idx >= (int)s.size()) break;
string convert(string s, int numRows) {
if (numRows <= 1) return s;
int n = s.length();
int cycle = 2 * numRows - 2;
string result;
for (int row = 0; row < numRows; ++row) {
for (int i = row; i < n; i += cycle) {
result += s[i];
// 中間行有第二個字符
if (row != 0 && row != numRows - 1) {
int second = i + cycle - 2 * row;
if (second < n) result += s[second];
}
}
}
return result;
}
| 場景 | 風險 | 防範 |
|---|---|---|
| signed 與 unsigned 比較 | 負數變巨大正數 | 統一轉為 signed 或用 static_cast |
| size_t 與 int 比較 | 同上 | (int)vec.size() |
| 容器索引運算 | 減法產生負數 | 先判斷邊界再運算 |
啟用 -Wsign-compare (GCC/Clang) 或 /W4 (MSVC) 可在編譯期捕獲此類問題。