Programming languages 实际示例中何时使用后减量/增量与预减量/增量?

Programming languages 实际示例中何时使用后减量/增量与预减量/增量?,programming-languages,Programming Languages,可能的重复项: 这在真实场景中何时使用 显而易见的是,当您希望返回旧值时,可以使用后期增量 更微妙的是,在使用后增量时,由于没有创建临时值并返回旧值,因此前增量永远不会变慢,也可能变快 一个在C++中使用POST增量的真实场景是从标准容器中擦除。例如: set<int> ctr; ctr.insert(1); ctr.insert(10); ctr.insert(12); ctr.insert(15); set<int>::iterator it = set.beg

可能的重复项:


这在真实场景中何时使用

显而易见的是,当您希望返回旧值时,可以使用后期增量

更微妙的是,在使用后增量时,由于没有创建临时值并返回旧值,因此前增量永远不会变慢,也可能变快

一个在C++中使用POST增量的真实场景是从标准容器中擦除。例如:

set<int> ctr;
ctr.insert(1);
ctr.insert(10);
ctr.insert(12);
ctr.insert(15);

set<int>::iterator it = set.begin();

// Post-increment so the value returned to erase is that of the previous
// iteration (i.e. begin()), yet the iterator stays valid due to the local
// iterator being incremented prior to the erase call
ctr.erase(it++);

// Still valid iterator can be used.
cout << "Value: " << *it << "\n";  
set-ctr;
中心插入(1);
中心插入(10);
中心插入(12);
中心插入(15);
set::iterator it=set.begin();
//Post增量,以便返回的擦除值与上一个值相同
//迭代(即begin()),但由于本地
//在擦除调用之前递增的迭代器
中心擦除(it++);
//仍然可以使用有效的迭代器。

cout澄清差异的最佳解释是:

  • i++-将i的值用于它所持有的任何值,然后获取i的值,增加它,并存储它
  • ++i-增加i的值并立即存储,然后使用该值

这是一个在语句求值后递增,另一个在语句求值前递增的关键区别。

我更喜欢使用
I++
,除非我特别需要
++I
的行为,因为这将变量放在左边,与
I+=N
一致。虽然这是次要的,但是在for循环中,我认为>++I/COD>是错误的,并且将更改为<代码> I++< /代码>,因为

for (i = 0; i < limit; ++i)
for(i=0;i
由于缺乏平行结构,使读者感到困惑

for (i = 0; i < limit; i++)
(i=0;i
更易于阅读,因为循环变量在所有三个子句中都处于相同的位置


来自性能的争论是一派胡言。任何称职的编译器都会在差异无关紧要的情况下生成完全相同的代码。是的,包括C++重载运算符的情况。对于微妙的优化提示,

+ 1。实际上,我认为几乎所有编译器都会在通常情况下优化代码< > i++<代码> >代码> ++i i/COD>(其中忽略操作的结果,而<代码> i>代码>没有超载增量/递减运算符)。这就是说,我仍然更喜欢增加/减少之前的内容,而不是增加/减少之后的内容,因为我认为这样可以更好地体现行动的意义。如果
i
恰好是一个用户定义的类型,带有自定义的
++
/
-
运算符,你可能会看到速度加快。@bcat同意你的看法。.在大多数情况下,预增量是有意义的,不知道为什么在学校教书时这会有这么大的影响。@codetolory:我不知道。在我的学校,所有的CS教授都使用职位增量,甚至是for循环。老实说,这让我有点疯狂这是有趣的,在C++中,如果使用简单的“代码”> ++/-//>代码,那么当使用普通的int时,尤其是在C(不是C++)中,差异是可以忽略的,特别是在Pdp/VAX-11体系结构中,登记/增量/减量是直接支持的,我猜这就是CS Prof使用后增量的原因。这是许多问题的重复,包括:这不是重复,因为我要求的是真实的例子。请参阅下面RC的答案。继续:@George您的大多数链接都是关于性能的。@codetoglory我刚刚开始,这里有几个问题问的正是您所问的,使用相同的措辞:您的答案最容易阅读,不幸的是,Stackoverflow上缺少简单的英语。
for (i = 0; i < limit; i++)