簡體   English   中英

C++ while 循環 v[i++] vs i++ in while body

[英]C++ while loop v[i++] vs i++ in while body

我有一個關於在 while 循環中迭代的問題。 所以假設我們有一個大小為 10 的向量,元素從 0 到 9。 我們有一個只迭代一次的 for 循環,在 for 循環中我們有一個 while 循環。 當我打印循環時,我得到了兩種不同的結果,但我不確定為什么。

我理解第一個循環背后的想法,我們在 while 的主體中增加 j 並且我們沒有在最后一次迭代中進入循環,因為 j 是 5,所以我們只打印 0-4。 第二個循環是我在理解方面遇到問題的地方。 我的邏輯是首先我們將指針 j 增加到 1,所以這就是我們計算 1 而不是 0 的原因。但是一旦 j 是 4 v[j++] = 5 並且在循環中的條件中,當 v[j++] = 5 時,為什么要這樣做我們還是 5 嗎? 任何幫助表示贊賞。

  vector<int> v(10);
  for(int i = 0; i < v.size(); i++){
    v[i] = i;
  }
  int j = 0;
  for(int i = 0; i < 1; i++){ // first loop
    while(v[j] != 5){
      cout << v[j]; //prints 0 1 2 3 4
      j++;
    }
  }
  for(int i = 0; i < 1; i++){ //second loop
    while(v[j++] != 5){
      cout << v[j]; //prints 1 2 3 4 5
    }
  }

j++將遞增的值j但返回的原始值j遞增之前。

 int i =0;
 int j = 0;
 i = 1;
 j = i++;
 (i is 2, j is 1)

來源

后綴遞增在概念上復制內存中的操作數,遞增原始操作數,最后產生副本的值。

下面的代碼片段相當簡單。 打印vector的內容后, j已增加。

vector<int> v(10);
for(int i = 0; i < v.size(); i++){
    v[i] = i;
}
int j = 0;

for(int i = 0; i < 1; i++){ // first loop
    while(v[j] != 5){
        cout << v[j]; //prints 0 1 2 3 4
        j++;
    }
}

現在,讓我們看看第二個循環。

vector<int> v(10);
for(int i = 0; i < v.size(); i++){
    v[i] = i;
}
int j = 0;
for(int i = 0; i < 1; i++){ // second loop
    // values of j are 0 1 2 3 4
    while(v[j++] != 5){
        // values of j are 1 2 3 4 5 because it has been incremented
        cout << v[j]; //prints 1 2 3 4 5
    }
}

如上所述,j++ 會增加 j,因此當 j 為 3 時,v[j++] 為 4,因此 while 中的條件不會被破壞。 但是因為 j++,當 cout 被執行時 j 是 4 並且 v[4] 是 5 所以 5 被打印出來

您忘記在第一個循環后重新初始化j 如果您想在第二個循環中從 1 打印到 5,那么您應該在第二個循環運行之前將j重新初始化為 0。 嘗試:

vector<int> v(10);
    for (int i = 0; i < v.size(); i++) {
        v[i] = i;
    }
    int j = 0;
    for (int i = 0; i < 1; i++) { // first loop
        while (v[j] != 5) {
            cout << v[j]; //prints 0 1 2 3 4
            j++;
        }
    }
    j = 0;
    for (int i = 0; i < 1; i++) { //second loop
        while (v[j++] != 5) {
            cout << v[j]; //prints 1 2 3 4 5
        }
    }

使用單個 for 循環將有助於更好地理解代碼,因為循環的兩個條件相同。

    vector<int> v(10);
    for (int i = 0; i < v.size(); i++) {
        v[i] = i;
    }
    int j = 0;
    for (int i = 0; i < 1; i++) { // first loop
        while (v[j] != 5) {
            cout << v[j]; //prints 0 1 2 3 4
            j++;
        }
// joined the end of the first loop and the start of the second loop
        j = 0;
        while (v[j++] != 5) {
            cout << v[j]; //prints 1 2 3 4 5
        }
    }

希望對回答你的問題有所幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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