1

2 つのスニペットがあります。

  while (indent-- > 0)
  {
    out << "  ";
  }
  while (indent > 0)
  {
    indent -= 1;
    out << "  ";
  }

私が見る限り、最初のスニペットで未定義の動作は発生していません (こちらを参照)。

私の質問は: これら 2 つのスニペットは同等ですか?

-=演算子は比較演算子よりも優先順位が高いため、最初のスニペットで最初に実行する必要があるため、よくわかりません。ただし、2 番目のスニペットは、比較後にのみこれを実行します。

4

3 に答える 3

5

ループの本体を同じ回数実行しますが、同じではありません。

条件が成功するか失敗するかに関係なく演算子が実行されるため、最初の演算子はindentを残して余分な時間を 1 つindent減らします。-1--

2 番目は に出発indent0ます。完全な動作例を次に示します。

#include <iostream>

int main()
{
   int indent = 3;
   while (indent-- > 0)
   {
      std::cout << "First ";  // Prints three times
   }

   std::cout << indent << std::endl;  // Prints -1

   indent = 3;
   while (indent > 0)
   {
      indent -= 1;
      std::cout << "Second ";  // Prints three times
   }

   std::cout << indent << std::endl;  // Prints 0
}

// Output:
// First First First -1
// Second Second Second 0
于 2013-03-07T09:45:51.170 に答える
4

ポストインクリメントであるため、2つの間に違いはありませんindent---以前の値を返します-ただしindent、違いはwhile (--indent > 0)あります。

したがって、基本型の場合、それらは同等です。

ただし、これは C++ であるため、独自のクラスを定義し、indentその型のオブジェクト、オーバーロード--=(int)および>それらをまったく異なる動作にすることもできます (そうでないことを願っています)。

編集:正しい、の値はindent同じではありません。

于 2013-03-07T09:36:20.583 に答える
3

私は彼らが違うと思います。欠けているのは、インデントとそのタイプの初期化です。

最初のループは常に比較後に減少し、2 番目のループは条件が真の場合にのみ減少します。ループの前に (indent > 0) が true の場合、それらはまったく同じように動作します。ただし、indent==0 の場合、最初のループでは一度も印刷せずに -1 になります。2番目はインデントを印刷しませんが、インデントも減らしません。

そのため、場合によっては異なります。

于 2013-03-07T09:42:00.610 に答える