我有两个片段:
while (indent-- > 0)
{
out << " ";
}
while (indent > 0)
{
indent -= 1;
out << " ";
}
据我所知,第一个片段中没有任何未定义的行为(请参见此处)。
我的问题是:这两个片段是否等效?
我不太确定,因为-=
运算符的优先级高于比较运算符,因此应该在第一个片段中首先执行。然而,第二个片段仅在比较后执行此操作。
它们将以相同的次数运行循环体,但它们并不相同。
第一个将indent
额外减少一个时间,离开indent
at -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
两者之间没有区别,因为indent--
它是一个后增量——它会返回之前的值indent
——虽然会有区别while (--indent > 0)
。
因此,对于基本类型,它们是等价的。
但是,由于这是 C++,您也可以定义自己的类,拥有indent
该类型的对象,重载--
并让它们=(int)
的>
行为完全不同(我希望不是这种情况)。
编辑:正确,的值indent
不一样。
我认为他们是不同的。缺少的是缩进及其类型的初始化。
第一个循环在比较后总是递减,只有在条件为真时才会递减。如果 (indent > 0) 在循环之前为真,它们的行为方式完全相同。但是,如果 indent==0,则第一个循环将使其变为 -1,而无需打印一次。其次不会打印任何缩进,但也不会减少缩进。
因此,它们在某些情况下是不同的。