【发布时间】:2025-12-31 20:20:02
【问题描述】:
请告诉我以下添加两个数据类型为int 的变量的代码之间的区别。我想知道哪个更好。
代码 A:
sum = sum + value;
代码 B:
sum += value;
我们通常更喜欢++ 运算符而不是+= 1。这背后还有什么具体原因吗?
我想知道上述代码在约定或效率水平方面的区别。推荐哪一个?
【问题讨论】:
请告诉我以下添加两个数据类型为int 的变量的代码之间的区别。我想知道哪个更好。
代码 A:
sum = sum + value;
代码 B:
sum += value;
我们通常更喜欢++ 运算符而不是+= 1。这背后还有什么具体原因吗?
我想知道上述代码在约定或效率水平方面的区别。推荐哪一个?
【问题讨论】:
它们都是相同的,都可以用于增加变量的值(存储在其中)。
x++ 将在每次运行时将 x 的值增加一 (1)。
+= 将右操作数添加到左操作数,并将结果存储在左操作数中。
如下所示:
C += A 与 C = 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
【讨论】:
虽然例如的最终结果someVar++ 运算符与 someVar += 1 相同,还有其他东西在起作用。
让我们做一个简单的陈述
foo = bar++;
实际上等价于(但不等于)
temp = bar;
bar += 1;
foo = temp;
至于前缀和后缀递增或递减运算符,它们有不同的operator precedence,这会影响使用这些运算符的指针运算。
至于区别
foo += 1;
和
foo = foo + 1;
对于原始类型(如int 或float)或指针类型没有什么不同,但如果foo 是一个具有运算符重载的对象,则有很大的不同。那么
foo += 1;
等于
foo.operator+=(1);
同时
foo = foo + 1;
等于
temp = foo.operator+(1);
foo.operator=(temp);
语义上有很大的不同。实际上也是如此,尤其是如果任何运算符重载函数有副作用,或者如果复制构造函数或析构函数有一些副作用(或者你忘记了the rules of three, five or zero)。
【讨论】:
E1 op= E2形式的复合赋值表达式是等价的 到E1 = (T)((E1) op (E2)),其中T是E1的类型,除了E1只评估一次。
引用自Java's +=, -=, *=, /= compound assignment operators的例子
[...] 下面的代码是正确的:
short x = 3;
x += 4.6;
并导致 x 的值为 7,因为它等价于:
short x = 3;
x = (short)(x + 4.6);
【讨论】:
一个叫运营商=和+,后来又叫运营商+=。
运算符 ++ 和 += 是首选,因为它易于阅读 - 大多数程序员都知道它们的意思。
另一方面,大多数现代编译器将为+= 1 生成与++ 和+/= 与+= 相同的代码;
但是对于用户定义的classs,实际的操作符将被调用,这取决于classs 的实现者来理解这一切。在这些情况下,++ 和 += 可能是最佳选择。
【讨论】:
sum 和value 是什么类型。这就是为什么没有关于推荐的具体答案的原因。如果它们是用户定义的类型并且 + 或 += 被重载,那么您可以通过查看这些重载的源并进行测试来决定什么是有效的。不,执行+1 并不能确定这些是否是ints。有人可以很容易地想出一个big_int 类,该类将int 作为重载+ 或+= 中的参数。
两者在功能上没有区别。 A += B 实际上意味着 A = A + B。第一个只是写第二个的更短的方式。
【讨论】:
A 和B 是什么以及这些运算符是否重载。
在显示的情况下,除了可能出于可读性目的之外,没有特别的理由偏爱一种增加值的方法而不是另一种方法。在这种情况下,我认为我更喜欢 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 @.
+= 用于良好编写 用户定义类型比使用operator + 更有效。原因是+ 创建了一个全新的对象,而+= 与现有对象一起工作。但请注意——写得很好。
sum += value 更容易阅读,因为(精神上)解析的标记更少 - 但同样,这是个人偏好和习惯的问题。如果需要证明,我的“理由”是,对我来说,它比 sum = sum + value 更容易和更快地理解 - 但是,我已经编写 C 及其衍生工具 30 多年(我的,其中 确实 时间过去了?:-) 所以也许只是我的习惯已经退化了很多。再次 - YMMV。
代码 A 和 B 做同样的事情。使用 Code B 的优点是打字速度更快,阅读更容易。
至于在+= 1 上使用++ 运算符,还是为了可读性。尽管foo++ 和++foo 之间存在差异。前者先读取后递增,后者先递增后读取。
【讨论】:
A 和 B 是否做同样的事情。
当您最小化代码时,您会减少出错(印刷错误或逻辑错误)的机会。
通过使用
sum += value;
您减少了打字时出错的机会——非常轻微
sum = sum + value;
value++;也一样
value += 1;
可能更容易与
混淆value += l; 其中 l 是一个变量....
更多的是关于一致性,它是关于对还是错,但减少代码是可维护性的主要奖励。
但是,在复杂的语句中,必须注意运算符的优先级。
【讨论】:
基本上是一样的。它都是一个运算符。
其中一个调用= 和+。还有一个+=..
所以如果你确实价值 +=5。值增加 5。+= 更好,更有条理。并缩短您的代码,这样会更好更专业。
【讨论】:
sum 和 value 是什么类型。所以是的,在语义上它意味着“添加”,但没有什么能阻止 + 和 += 的重载做一些完全低效或非正统的事情。
cout << sum++; 将在 sum 增加之前打印出 sum 的值。此外,根据您的操作,您可以覆盖运算符+= 和+。
【讨论】: