我正在嘗試對字串進行反向迭代,但是在最新的 VS 中遇到 [] 運算子的斷言失敗。
int foo() {
std::string s = "s";
for (int i = (s.size() - 1); i >= 0; i--) {
std::cout << s[i] << std::endl;
}
return 0;
}
注釋掉 cout 行會給出無限回圈警告,并且確實會進入無限回圈:
int foo2() {
std::string s = "s";
for (int i = (s.size() - 1); i >= 0; i--) {
//std::cout << s[i] << std::endl;
}
return 0;
}
在 for 回圈中有或沒有任何內容的情況下,向前迭代都可以正常作業:
int bar() {
std::string s = "s";
for (int i = 0; i < s.size(); i ) {
std::cout << s[i] << std::endl;
}
return 0;
}
我正在使用 C 14 標準和用于其他編譯器/舊版本 VS 的相同代碼。任何字串大小都存在相同的問題(盡管這應該無關緊要)。我知道我可以修改代碼以使用和取消參考指標而不是使用 int,但想了解為什么這不再起作用,為什么它不安全或不正確,或者我還缺少什么。謝謝!
uj5u.com熱心網友回復:
注釋掉 cout 行會給出無限回圈警告,并且確實進入了無限回圈
s.size()
是 aunsigned long
所以它永遠不會小于0
。由于分配unsigned long
to而縮小轉換的行為是實作定義的行為,盡管在將值 0int
分配給 時它不應該是一個問題,至少我不這么認為,但是誰知道,MSVC 確實有它的怪癖。unsigned long
int
看起來編譯器足夠聰明,可以預測當這個特定的回圈體存在時不會出現無限回圈for
,這讓我相信訪問陣列時可能會拋出例外,可能是越界訪問。
使用除錯器跟蹤 的值i
是了解正在發生的事情的最佳選擇。
uj5u.com熱心網友回復:
該問題實際上最初是由“auto”i 而不是“int”i 引起的,但沒有正確重繪 。Auto 給 i 一個 unsigned int 型別,它會溢位 [] 運算子,或者一旦 i = 0 回圈完成并執行 i-- 就會導致無限回圈從零翻轉到 18446744073709551615。
謝謝大家的有用回復!
uj5u.com熱心網友回復:
可能是您的 int 默認為無符號,因此當 i=0 導致高值時遞減?
正如@PeteBecker 提到的, int 應該簽名并且不應該溢位。但是我的猜測是您的實際代碼不使用 int。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/470696.html
上一篇:替換為單行的串列迭代