【问题标题】:+= Operator in C+++= C++ 中的运算符
【发布时间】:2025-12-31 20:20:02
【问题描述】:

请告诉我以下添加两个数据类型为int 的变量的代码之间的区别。我想知道哪个更好。

代码 A:

sum = sum + value;

代码 B:

sum += value;

我们通常更喜欢++ 运算符而不是+= 1。这背后还有什么具体原因吗?

我想知道上述代码在约定或效率水平方面的区别。推荐哪一个?

【问题讨论】:

    标签: c++ operators


    【解决方案1】:

    它们都是相同的,都可以用于增加变量的值(存储在其中)。

    x++ 将在每次运行时将 x 的值增加一 (1)。

    += 将右操作数添加到左操作数,并将结果存储在左操作数中。 如下所示: C += AC = C + A 相同

    +++= 之间的区别在于,第一个只能递增一 (1),而 += 可用于在一行中递增多个。

    例如:

    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
    

    【讨论】:

      【解决方案2】:

      虽然例如的最终结果someVar++ 运算符与 someVar += 1 相同,还有其他东西在起作用。

      让我们做一个简单的陈述

      foo = bar++;
      

      实际上等价于(但不等于)

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

      至于前缀和后缀递增或递减运算符,它们有不同的operator precedence,这会影响使用这些运算符的指针运算


      至于区别

      foo += 1;
      

      foo = foo + 1;
      

      对于原始类型(如intfloat)或指针类型没有什么不同,但如果foo 是一个具有运算符重载的对象,则有很大的不同。那么

      foo += 1;
      

      等于

      foo.operator+=(1);
      

      同时

      foo = foo + 1;
      

      等于

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

      语义上有很大的不同。实际上也是如此,尤其是如果任何运算符重载函数有副作用,或者如果复制构造函数或析构函数有一些副作用(或者你忘记了the rules of three, five or zero)。

      【讨论】:

        【解决方案3】:

        E1 op= E2 形式的复合赋值表达式是等价的 到E1 = (T)((E1) op (E2)),其中TE1的类型,除了E1 只评估一次。

        引用自Java's +=, -=, *=, /= compound assignment operators的例子

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

        short x = 3;
        x += 4.6;
        

        并导致 x 的值为 7,因为它等价于:

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

        【讨论】:

          【解决方案4】:

          一个叫运营商=+,后来又叫运营商+=

          运算符 +++= 是首选,因为它易于阅读 - 大多数程序员都知道它们的意思。

          另一方面,大多数现代编译器将为+= 1 生成与+++/=+= 相同的代码;

          但是对于用户定义的classs,实际的操作符将被调用,这取决于classs 的实现者来理解这一切。在这些情况下,+++= 可能是最佳选择。

          【讨论】:

          • 但在我的情况下,两者最后都做同样的事情。你会推荐哪种方法?
          • @ItbanSaeed 您的原始帖子没有提到sumvalue 是什么类型。这就是为什么没有关于推荐的具体答案的原因。如果它们是用户定义的类型并且 ++= 被重载,那么您可以通过查看这些重载的源并进行测试来决定什么是有效的。不,执行+1 并不能确定这些是否是ints。有人可以很容易地想出一个big_int 类,该类将int 作为重载++= 中的参数。
          • @PaulMcKenzie 很抱歉造成误解。感谢您的更正:)
          【解决方案5】:

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

          【讨论】:

          • 只是重复我的其他 cmets -- 我们没有足够的信息来确定功能上是否存在差异。这完全取决于AB 是什么以及这些运算符是否重载。
          【解决方案6】:

          在显示的情况下,除了可能出于可读性目的之外,没有特别的理由偏爱一种增加值的方法而不是另一种方法。在这种情况下,我认为我更喜欢 sum += value 而不是 sum = sum + value,因为它更简洁(我认为)更清晰,但 YMMV 就是这样。

          至于++ 优于+= 1,(IMO 再次)++ 在将值作为表达式的一部分递增时更可取,例如sum += array[index++] - 但如果所做的全部工作是在值上加一,我更喜欢index += 1。但让我们面对现实吧,这在很大程度上是个人喜好和一时冲动的选择。我总是尝试写出我当时认为是最简单和最清晰的代码 - 但我必须承认,当我稍后回去阅读我自己的一些代码时,我会有更多“我在想什么?!? "比我愿意承认的时刻。 :-)

          YMMV.

          祝你好运。

          【讨论】:

          • 感谢这个很好的解释,但在我看来,sum = sum + value 看起来比sum += value 更具可读性,所以我为什么要使用sum += value 此外,你能把它与效率联系起来吗?标准约定? 我同意一个人应该写他的想法,但让我们假设我们必须证明我们代码的每一条语句都是合理的,那么你将如何证明 sum += value 的合理性,因为(IMO)它的可读性不如 @987654332 @.
          • @ItbanSaeed 运算符+= 用于良好编写 用户定义类型比使用operator + 更有效。原因是+ 创建了一个全新的对象,而+= 与现有对象一起工作。但请注意——写得很好
          • @ItbanSaeed - 我同意 PaulMcKenzie 在评论中关于用户编写的类型/类的 C++ 问题所写的内容。在我看来,sum += value 更容易阅读,因为(精神上)解析的标记更少 - 但同样,这是个人偏好和习惯的问题。如果需要证明,我的“理由”是,对我来说,它比 sum = sum + value 更容易和更快地理解 - 但是,我已经编写 C 及其衍生工具 30 多年(我的,其中 确实 时间过去了?:-) 所以也许只是我的习惯已经退化了很多。再次 - YMMV。
          【解决方案7】:

          代码 A 和 B 做同样的事情。使用 Code B 的优点是打字速度更快,阅读更容易。

          至于在+= 1 上使用++ 运算符,还是为了可读性。尽管foo++++foo 之间存在差异。前者先读取后递增,后者先递增后读取。

          【讨论】:

          • 见我的 cmets。除非我们确切知道所使用的类型,否则无法确定 AB 是否做同样的事情。
          【解决方案8】:

          当您最小化代码时,您会减少出错(印刷错误或逻辑错误)的机会。

          通过使用

          sum += value;
          

          您减少了打字时出错的机会——非常轻微

          sum = sum + value;
          

          value++;也一样

          value += 1;
          

          可能更容易与

          混淆

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

          更多的是关于一致性,它是关于对还是错,但减少代码是可维护性的主要奖励。

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

          【讨论】:

            【解决方案9】:

            基本上是一样的。它都是一个运算符。

            其中一个调用=+。还有一个+=..

            所以如果你确实价值 +=5。值增加 5。+= 更好,更有条理。并缩短您的代码,这样会更好更专业。

            【讨论】:

            • OP 没有指定 sumvalue 是什么类型。所以是的,在语义上它意味着“添加”,但没有什么能阻止 ++= 的重载做一些完全低效或非正统的事情。
            【解决方案10】:

            cout << sum++; 将在 sum 增加之前打印出 sum 的值。此外,根据您的操作,您可以覆盖运算符+=+

            【讨论】:

            • 我关心我在代码中提到的具体语句。 你会推荐哪一个?为什么?
            • 我可以建议代码 B 以提高可读性。至于 ++ vs +=1,为了可读性,我更喜欢 ++。