代碼錯誤合集—1—運算子優先級的錯誤—i++、++i、i+1的區別
2021/6/14
在打通訊錄管理系統的洗掉聯系人時發現了這么一個問題
//初始錯誤版本
if (ret != -1)
{
//查找到人,要進行洗掉操作
for (int i = ret; i < abs->m_Size; i++)
{
//資料前移
abs->personArray[i] = abs->personArray[i++];
}
abs->m_Size--;//更新通訊錄中的人員數
cout << "洗掉成功" << endl;
}
這一段代碼特別有意思
①視頻中原本是abs->personArray[i] = abs->personArray[i+1];的,但是我給寫成了i++了
導致了運行時出現了原本想要洗掉的聯系人資訊沒有洗掉,還出現了其他問題
如圖:
我想洗掉聯系人2
聯系人2變成了2個,聯系人4也變成了兩個(有5個資料是因為我想看看其他幾個有沒有變化,就沒有做–的運算)
后來想了想,應該是運算子的優先問題
=的優先級比++的優先級低,加上i++的特殊性(先賦值后運算),所以運算順序變成了:(原本i=1)
personArray[1]變成了personArray[2] (自增)→personArray[2]=personArray[1]→先賦值后自增→第三個人的資訊變成了第二個人的資訊,到此一次回圈結束
接著,是我想了好久的一點:
我上面還寫了for回圈,回圈結束后又來了一次i++,到此,已經直接跳過了i=2(即第三個人)的資訊賦值給了第四個人的階段,也就不會出現了后面所有資訊都是第二個人的情況
所以第二次回圈的開始,原本的i=1已經變成了i=3
接下來就是重復以上步驟,第五個人的資訊變成了第四個人的了
然后就是退出回圈,接著陣列-1了
②之后我沒多想(聯系①接下去),以為是先賦值后自增的情況,就把原本代碼中的i++改成了++i
改了之后又運行了一遍,發現所有聯系人都沒變

按照上面所說,還是優先級的問題
(原本i=1)
personArray[1]變成了personArray[2] (自增)→先自增后賦值→personArray[2]=personArray[2]→第三個人的資訊變成了第三個人的資訊,資訊沒變,到此一次回圈結束
接著又是for回圈里的i++,第二次回圈的開始,原本的i=1變成了i=3
接著重復以上步驟,第五個人的資訊變成了第五個人的資訊了
依舊沒變
所有,一開始沒搞懂,弄了半天我放棄了,就直接改成了i+1,
是后來在寫這篇文章的時候搞懂的,當然,花了一個小時左右(畢竟腦子不太靈光,[汗])
至此,這個問題也算解決了,如果以上的觀點和解釋有誤的話,歡迎糾正
下面是正確情況下截圖

.
.
.
.
.
備注1:這是存盤的聯系人

備注2:這是沒有for回圈中i++的情況(但是刪減了陣列)

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/287708.html
標籤:其他
上一篇:陣列的基本知識及練習題
