C++中的+=运算符

13

请有人告诉我以下两个代码在将数据类型为int的两个变量相加时的区别。我想知道哪个更好。

代码A:

sum = sum + value;

代码 B:

sum += value;

通常我们更喜欢使用++运算符而不是+= 1。这背后有什么特定的原因吗?

我想知道上述代码在传统或效率水平方面的区别。哪个更受推荐?

10个回答

17
虽然e.g. someVar++运算符的最终结果与someVar += 1相同,但还有其他因素在起作用。
让我们来看一个简单的语句:
foo = bar++;

这实际上是等价的(但不相等)

temp = bar;
bar += 1;
foo = temp;

关于前缀和后缀的递增或递减运算符,它们有不同的运算符优先级,这将影响使用这些运算符进行指针算术等操作。


关于“之间的差异”
foo += 1;

并且

foo = foo + 1;

对于原始类型(如intfloat)或指针类型,没有区别,但如果foo是一个具有运算符重载的对象,则存在非常大的差异。然后

foo += 1;

等于

foo.operator+=(1);

foo = foo + 1;

等于

temp = foo.operator+(1);
foo.operator=(temp);

从语义上来说,这是非常大的区别。实际上也是如此,特别是如果任何一个操作符重载函数具有副作用,或者复制构造函数或析构函数具有一些副作用(或者您忘记了三五零规则)。


14

一般称=+为赋值运算符和加法运算符;称+=为自加运算符。

由于易读性,程序员更倾向于使用+++=

然而,对于内置数据类型,大多数现代编译器将为+= 1生成与+++/=相同的代码;

但对于用户自定义类,实际上会调用相应的运算符,这就需要类的实现者来理清整个过程。在这些情况下,使用+++=可能更优。


但在我的情况下,最终两种方法都是一样的。你会推荐哪种方法? - Itban Saeed
3
你原来的帖子没有提到sumvalue是哪种类型。因此,没有具体的答案可以推荐。如果它们是用户定义的类型,并且已经重载了++=,那么你需要查看这些重载的源代码并进行测试来决定哪种方法是更高效的。但是,请注意,通过执行+1不能确定这些变量是否为int类型。有人可能会设计一个big_int类,在重载的++=中使用一个int作为参数。 - PaulMcKenzie
@PaulMcKenzie 对于误解我很抱歉。感谢您的纠正 :) - Itban Saeed

7

cout << sum++;会在自增之前输出sum的值。此外,根据您所做的操作,您可以重载运算符+=+


我关注于我在代码中提到的具体语句。你会推荐哪一个,为什么? - Itban Saeed
我建议使用代码B来提高可读性。至于++和+=1,为了可读性,我仍然更喜欢使用++。 - Pétur Ingi Egilsson

6
当你最小化代码时,你会减少错误的机会(例如打字错误或逻辑错误)。
通过使用 标签,您可以将代码与普通文本区分开来。
sum += value;

通过使用输入法,您可以稍微降低打字时出错的几率

sum = sum + value;

value++;相同。
value += 1;

可能会更容易混淆

value += l; 其中l是一个变量....

这更多的是关于一致性,而不是对错,但减少代码可以大大提高可维护性。

然而,在复杂语句中必须注意运算符的优先级。


5
在这种情况下,没有特定的原因来优先选择一种增加值的方法,除了可能是出于可读性的考虑。在这种情况下,我认为我更喜欢使用sum += value而不是sum = sum + value,因为它更加简洁和清晰(我认为),但这取决于个人喜好。
至于选择++还是+= 1,(我再次强调)在将增量作为表达式的一部分时,++更可取,例如sum += array[index++] - 但如果整个操作的目的就是将一个值加一,我会更喜欢index += 1。但是让我们面对现实,很多时候这都是个人偏好和即兴选择。我总是试图写出我认为当时最简单和最清晰的代码 - 但我必须承认,当我回过头去看我的一些代码时,我有更多的“我当时在想什么?!”的时刻,比我愿意承认的要多。
你的经验可能会有所不同。
祝你好运。

谢谢你的详细解释,但我认为 sum = sum + value 看起来更易读,而不是 sum += value。那么我为什么要使用 sum += value 呢?此外,您能否将其与效率或标准惯例联系起来? 我同意应该写下自己的想法,但假设我们必须证明代码中的每个语句,那么你如何证明 sum += valuesum = sum + value 更易读(在我看来)? - Itban Saeed
2
@ItbanSaeed 对于一个良好编写的用户定义类型来说,使用+=运算符比使用operator +更高效。原因是+会创建一个全新的对象,而+=则可以直接在现有对象上进行操作。但需要注意的是,这只适用于良好编写的类型。 - PaulMcKenzie
1
@ItbanSaeed - 我同意PaulMcKenzie在他的评论中提到的有关用户编写类型/类的C++问题。在我看来,sum += value 更容易阅读,因为需要(精神上)解析的标记更少 - 但是,这又是个人偏好和习惯的问题。如果需要理由,我的“理由”是对我来说,它比 sum = sum + value 更容易和更快地理解 - 但是,我已经写了30多年的C及其衍生语言(我的时间去哪里了? :-)),所以也许只是我的习惯几乎萎缩了。再次强调-你的情况可能会有所不同。 - Bob Jarvis - Слава Україні

4

代码A和B执行的是相同的操作。使用代码B的优点在于打字更快,阅读更容易。

至于使用++运算符还是+= 1,同样是为了可读性。虽然foo++++foo之间存在差异。前者先被读取然后再增加,而后者则是先增加再读取。


除非我们确切知道使用的类型是什么,否则无法确定 AB 是否执行相同的操作。 - PaulMcKenzie

2

形如E1 op= E2的复合赋值表达式等效于E1 = (T)((E1) op (E2)),其中TE1的类型,但是E1只被计算一次。

以下是引自Java +=、-=、*=、/= 复合赋值运算符的一个例子:

[...] 下面的代码是正确的:

short x = 3;
x += 4.6;

这将导致 x 的值为 7,因为它等同于:

short x = 3;
x = (short)(x + 4.6);

1
它们在某些方面是相同的,都可以用于增加变量(存储在其中)的值。 x++ 将在每次运行时将 x 的值增加一 (1)。 += 将右操作数添加到左操作数并将结果存储在左操作数中。类似以下内容:C += AC = C + A 相同。 +++= 之间的区别在于前者只能增加一 (1),而 += 可以用于在一行中增加多个。

e.g:

x += 1; // will increment by 1 every run time
x += 4; // will increment by 4 every run time
x += 10; // will increment by 10 every run time

1

这其实是同样的东西。它们都是运算符。

其中一个调用=+。另一个是+=

所以如果你输入 value +=5,value 就会增加 5。+= 更好、更有组织性。它可以缩短代码,更为专业。


3
OP没有说明sumvalue的类型。因此,从语义上讲它意味着“相加”,但是++=的重载可能会执行某些完全低效或非正统的操作。 - PaulMcKenzie

1

在功能上,这两者没有区别。A += B 实际上意味着 A = A + B。第一个只是写第二个的更短的方式。


2
只是重申我的其他评论 - 我们没有足够的信息来确定功能是否有差异。这完全取决于 AB 是什么以及这些运算符是否被重载。 - PaulMcKenzie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接