这两个while循环是等效的吗?

时间:2013-03-07 09:33:10

标签: c++ loops

我有两个片段:

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

据我所知,第一个片段中没有任何未定义的行为(请参阅here)。

我的问题是:这两个片段是否相同?

我不太确定,因为-=运算符的优先级高于比较运算符,因此应首先在第一个代码段中执行。但是,第二个片段仅在比较后执行此操作。

3 个答案:

答案 0 :(得分:5)

他们将循环体运行相同的次数,但它们不一样。

第一个会减少indent一个额外的时间,将indent保留在-1,因为无论条件成功还是失败,--运算符都会运行。

第二个将indent留在0。这是一个完整的工作示例:

#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

答案 1 :(得分:4)

两者之间没有区别,因为indent--是后增量 - 它会返回indent的先前值 - 但while (--indent > 0)会有所不同。

因此,对于基本类型,它们是等价的。

因为这是C ++,你也可以定义自己的类,让indent成为该类型的对象,重载--=(int)以及>让他们的行为完全不同(我希望事实并非如此)。

编辑:正确,indent的值不一样。

答案 2 :(得分:3)

我认为他们是不同的。缺少的是缩进的初始化及其类型。

第一个循环在比较后总是递减,仅在条件为真时递减。如果(indent&gt; 0)在循环之前为真,则它们的行为方式完全相同。但是,如果缩进== 0,则第一次循环将使其为-1而不打印一次。第二个不会打印任何缩进,但也不会减少缩进。

因此,在某些情况下它们是不同的。