使用(递增/递减)运算符而不是变量(+/-)1有什么好处?
除了缩短代码之外还有其他优点吗?
答案 0 :(得分:2)
有一个:增量/减量限制为一个。例如,使用向前/向后迭代器:
// Assume a forward_iterator would support operator +
forward_iterator operattor + (const forward_iterator&, size_type n) {
switch(n) {
case 1: // return next forward_iterator
break;
default: // throw an exception ?
break;
}
}
运算符++避免了上述问题。
答案 1 :(得分:1)
例如输入迭代器没有operator +。它们只有增量运算符。使用递增和递减运算符使代码更具表现力。
答案 2 :(得分:1)
在讨论像int这样的内置类型和没有副作用的语句时,没有什么区别,它只是化妆品。
但是在C ++中你可能有一个迭代器类/对象,对于迭代器++ x,x ++,x + = 1和x = x + 1是不一样的。
x=x+1;
类似于tmp=x.operator+(1); x.operator=(tmp);
,它使用Addition的结果创建tmp对象,然后将tmp对象复制到x x+=1
类似于直接修改x的x.operator+(1)
x++
类似于调用(void)x.operator++()
,其中operator++
生成x的临时副本,修改x并返回稍后被丢弃的临时副本++x
类似于调用x.operator++()
operator++
只修改x 请注意,我在++ x和x ++的描述中给出的两个operator ++是不同的运算符。如果你想覆盖它们,你会写
X& X::operator++(); //pre increment
const X X::operator++(int); //post increment
大多数迭代器支持++和 - 而不是所有支持+。如你所见,前缀++比postfix ++有更好的性能。通常更改为前缀++。
是个好主意答案 3 :(得分:0)
--departments[i].persons[j].salaries[month];
中的可读性和a[++i] = b[++j];
答案 4 :(得分:0)
编译器将在每种情况下创建相同的*汇编代码。
唯一的好处将来自代码可读性。
(*)查看https://stackoverflow.com/a/12990882/2703169
所有这些都将调用相同的汇编程序指令(尽管顺序不同),并且性能将完全相同。
答案 5 :(得分:0)
递增/递减运算符++/--
实际上是下一个/上一个内置函数,并且总是递增/递减1,但是variable+/-x
不限于1,并且可以采用更大/更小值。它们还允许隐式控制何时发生递增/递减:i++
将在使用后递增i,++i
将在使用i
之前递增它,例如< / p>
int i = 1;
cout << i++ << endl; // outputs 1, sets i to 2 after the cout
cout << ++i << endl; // outputs 3, sets i to 3 before the cout
您可以使用i+1
实现相同的目标,并将其放在您希望使用i
的指令之前或之后,但增量/减量运算符可以节省程序员手指的使用,并且更加优雅。< / p>
兴趣点
我认为我最好提一下这一点,虽然我认为它不在原来的答案范围内:你还需要记住在你使用每种运营商类型时支付的操作以及数据的处理方式特别注意:
++i
和i+=x
一样):这会将i
的值修改为单个增量(++
)或范围(x
)i++
和i=i+x
):这会复制I的值(++
为1,x
为+x+
}),将现有变量I修改为与临时变量相同的值,返回临时变量值,然后当临时变量超出其使用寿命的范围时,它将被销毁。