簡體   English   中英

前/后增量說明

[英]Pre / Post Increment Explanation

請對我很輕松,不要拍我,因為我還是新手。

當我運行這段代碼時,我完全感到困惑,無法終身解決原因:

int y = 9;
cout << "++y = " << ++y << "\n--y = " << --y << "\ny++ = " << y++ << "\ny-- = " << y-- << "\n";
cout << "y = " << y << "\n";

我得到以下結果:

y = 9
++y = 9
--y = 9
y++ = 8
y-- = 9
y = 9

而不是這些結果:

y = 9
++y = 10
--y = 9
y++ = 9
y-- = 10
y = 9

我從這段代碼得到的:

int y = 9;
cout << "y = " << y << "\n";
cout << "++y = " << ++y << "\n";
cout << "--y = " << --y << "\n";
cout << "y++ = " << y++ << "\n";
cout << "y-- = " << y-- << "\n";
cout << "y = " << y << "\n";

任何人都可以解釋 - 盡可能簡單的單詞 - 在第一個代碼中會發生什么,以便以這種方式打印結果?

一個簡單的規則是,您不應該在任何給定語句中多次增加相同位置。 所以你不應該編碼cout << y++ << ++y << endl; 其中包含兩個y增量(假設為int y;聲明)。

有關詳細信息,請閱讀C ++標准中的序列點未定義行為

有很多相關的問題。 仔細研究它們!

當根據規則操作*要在+之前計數,而++之前計算*時,它將是如此。

 a*b++ + c // first b++ (returns **old** b), than a*b, than ...+c

但是當你有一個++ * a--時, 沒有人能夠說出,兩個操作數中的哪一個,一個++或一個 - 將被評估為第一個。 根據ANSII標准,即使您使用相同的翻譯器,結果也是每次都無法預測。

引用C ++ ANSII標准:

除非另有說明,否則單個運算符的操作數和單個表達式的子表達式的評估順序以及副作用發生的順序是未指定的。 在上一個和下一個序列點之間,標量對象的表達式評估最多只能修改一次存儲值。 此外,只能訪問先前值以確定要存儲的值。 對於完整表達的子表達式的每個允許排序,應滿足本段的要求; 否則行為未定義。 [例:

      i = v[i++];      // the behavior is undefined
      i = 7, i++, i++; // `i' becomes 9

      i = ++i + 1;     // the behavior is undefined 
      i = i + 1;       // the value of 'i' is incremented

序列點:

  • 在完整表達式的評估結束時(完整表達式是表達式語句,或任何其他表達式,不是任何更大表達式中的子表達式);
  • 在||,&&,?:和逗號運算符;
  • 並在函數調用(在所有參數的評估之后,以及在實際調用之前)。

所以,|| 是一個序列點,但<<不是。

Mulitiline版本的第一個代碼應該是:

  y = 9;
  cout << "y-- = " << y-- << "\n";
  cout << "y++ = " << y++ << "\n"
  cout << "--y = " << --y << "\n"
  cout << "++y = " << ++y << "\n"
  cout << "y = " << y << "\n";

暫無
暫無

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

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