void func(forward_list& lst, string s1, string s2) {
auto current = lst.begin();
auto prev = lst.before_begin();
while (*current != s1 && current != lst.end()) // 錯誤:current 可能為 end()
prev = current++;
if (current != lst.end())
lst.insert_after(current, s2);
else
lst.insert_after(prev, s2);
}
`while` 條件**左至右求值**:先評估 `*current != s1`,再評估 `current != lst.end()`。當 `current == lst.end()` 時,`*current` 解引用**過去末端迭代器**,導致未定義行為(通常崩潰:`forward_list iterator not dereferencable`)。
while (current != lst.end() && *current != s1) // 先檢查是否為 end()
prev = current++;
利用 `&&` **短路求值**:若 `current == lst.end()` 為真,直接短路,**不再執行** `*current != s1`,避免解引用失效迭代器。
void func(forward_list& lst, const string& s1, const string& s2) {
auto current = lst.begin();
auto prev = lst.before_begin();
while (current != lst.end() && *current != s1) {
prev = current++;
}
if (current != lst.end()) {
lst.insert_after(current, s2); // 找到 s1,在其後插入
} else {
lst.insert_after(prev, s2); // 未找到,在最後插入(prev 指向最後一個元素)
}
}