我有两个片段:
while (indent-- > 0)
{
out << " ";
}
while (indent > 0)
{
indent -= 1;
out << " ";
}
据我所知,第一个片段中没有任何未定义的行为(请参阅here)。
我的问题是:这两个片段是否相同?
我不太确定,因为-=
运算符的优先级高于比较运算符,因此应首先在第一个代码段中执行。但是,第二个片段仅在比较后执行此操作。
答案 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而不打印一次。第二个不会打印任何缩进,但也不会减少缩进。
因此,在某些情况下它们是不同的。