[英]Pointer arithmetic within the while loop exit condition with C++?
編輯帖子答案:這不是指針算術問題,請參閱答案 #1
我想弄清楚為什么下面的兩個程序不等價。 我是第一次學習指針,我認為我對指針算法的理解不正確。 我正在使用 C++
int main()
{
int array[] = {0,1,2,3,4,5,6,7,8,9};
int *pArray = array;
int *pArrayLast = pArray + 10;
while(pArray < pArrayLast)
{
cout << *pArray << " ";
pArray++;
}
}
輸出如下
0 1 2 3 4 5 6 7 8 9
現在,由於*pArrayLast = pArray + 10
所以我想我應該能夠用pArray < (pArray + 10)
替換pArray < pArrayLast
while
循環條件
int main()
{
int array[] = {0,1,2,3,4,5,6,7,8,9};
int *pArray = array;
while(pArray < (pArray + 10))
{
cout << *pArray << " ";
pArray++;
}
}
輸出如下
infinite while loop
這是怎么回事? 為什么不pArray < pArrayLast == pArray < (pArray + 10)
? (pArray + 10)
不是在while
循環退出條件中首先求值嗎?
這可能只是一個錯字,但在您的第二個代碼片段中, while
循環比較永遠不會是錯誤的,因為您正在測試一個值是否小於“自身 + 10”。
您可能想要的是在每次遞增后將pArray
指針與其原始值進行比較,該值是array
地址的副本; 所以我們可以使用它。
以下代碼與您的第一個代碼片段“等效”:
#include <iostream>
int main()
{
int array[] = { 0,1,2,3,4,5,6,7,8,9 };
int* pArray = array;
while (pArray < (array + 10)) { // Compare to the 'original' value plus 10!
std::cout << *pArray << " ";
pArray++;
}
return 0;
}
不能用pArray < (pArray + 10)
替換pArray < pArrayLast
的原因是因為在 while 循環中pArray
發生了變化,導致(pArray + 10)
也發生了變化。 當pArray
改變時, (pArray + 10)
不再是原來的(pArray + 10)
。
讓我們一步一步地分析差異。
如果你使用pArray < pArrayLast
// before the while loop
pArray: array
pArrayLast: pArray+10 = array+10
// after executing while loop the 1st time
pArray: pArray++ = array+1
pArrayLast: (not changed) = array+10
// after executing while loop the 2nd time
pArray: pArray++ = array+2
pArrayLast: (not changed) = array+10
// ...
// after executing while loop the 10th time
pArray: pArray++ = array+10
pArrayLast: (not changed) = array+10
// pArray=array+10 and pArrayLast=array+10
// pArray<pArrayLast is no longer true
// so leave the while loop
如果你使用pArray < (pArray+10)
// before the while loop
pArray: array
pArray+10: pArray+10 = array+10
// after executing while loop the 1st time
pArray: pArray++ = array+1
pArray+10: pArray+10 = (array+1)+10 = array+11 // << changed!
// after executing while loop the 2nd time
pArray: pArray++ = array+2
pArray+10: pArray+10 = (array+2)+10 = array+12 // << changed!
// ...
// after executing while loop the 10th time
pArray: pArray++ = array+10
pArray+10: pArray+10 = (array+10)+10 = array+20 // << changed!
// (pArray+10) always changes when pArray changes
// and (pArray+10) is always bigger then pArray
// so it becomes a infinite loop
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.