1

我有两个片段:

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

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

我的问题是:这两个片段是否等效?

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

4

3 回答 3

5

它们将以相同的次数运行循环体,但它们并不相同。

第一个将indent额外减少一个时间,离开indentat -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
于 2013-03-07T09:45:51.170 回答
4

两者之间没有区别,因为indent--它是一个后增量——它会返回之前的值indent——虽然会有区别while (--indent > 0)

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

但是,由于这是 C++,您也可以定义自己的类,拥有indent该类型的对象,重载--并让它们=(int)>行为完全不同(我希望不是这种情况)。

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

于 2013-03-07T09:36:20.583 回答
3

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

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

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

于 2013-03-07T09:42:00.610 回答