簡體   English   中英

使用 C++ 在 while 循環退出條件中進行指針運算?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM