【问题标题】:What exactly does the "+=" operator do? [closed]“+=”运算符到底是做什么的? [关闭]
【发布时间】:2019-06-10 16:29:09
【问题描述】:

我已经知道x += 1 的意思是x = x + 1=-symbol 将其右侧的算术表达式的值分配给左侧的变量。 但是如果我有一个像x += y % 3 这样的表达式,这是否意味着x = (x + y) % 3x = x + (y % 3)+= 运算符既为变量分配值又表达算术,这让我很困惑。

不幸的是,我目前不能只测试一些代码来检查,所以我希望我能在这里得到一些帮助。 我是 C++ 新手,所以其中一些非常基本的东西仍然让我感到困惑......

【问题讨论】:

  • 无法编写代码进行检查是公平的。但是如果你能写一个 SO 帖子,你肯定可以查找this table
  • % 具有更高的优先级,因此x += y % 3x += (y % 3),这会将x 增加y % 3
  • "但是如果我有一个像x += y % 3 这样的表达式,这是否意味着x = (x + y) % 3x = x + (y % 3)" 你的表达式没有括号,所以它有x = x + y % 3。每个操作的执行顺序由运算符优先级决定。
  • 我投票决定将此问题作为题外话结束,因为它是一个清晰、有据可查的教科书问题,不应该是问题堆栈溢出。

标签: c++


【解决方案1】:

=-symbol 将它右边的算术表达式的值分配给它左边的变量

分配结果。分配是不同的东西,稍后记住差异很重要(如果将动态分配与分配混为一谈,尤其是动态分配会非常混乱)。

但如果我有一个像x += y % 3 这样的表达式,那是指x = (x + y) % 3 还是x = x + (y % 3)

使用复合+=-= 等运算符的部分原因是您不要像这样扩展表达式,避免重写造成的歧义。

x += y % 3

可以读作

tmp = y % 3; // evaluate right hand side
x += tmp;    // assign to left hand side

(如果您真的愿意,可以将x += tmp 扩展为x = x + tmp tmp 被评估之后)。

在任何情况下,规则都记录在here,无论如何您绝对可以测试一些代码来检查:https://ideone.com/81tvjH

【讨论】:

    【解决方案2】:

    这里有一个混淆,因为你认为x += 1; 总是x = x + 1。这适用于整数、双精度......但通常不适用于其他对象。许多实现不会创建临时对象。或者可以做一些非常邪恶的事情。

    那么这是对operator+= 的调用,它将赋值右侧的结果作为参数。

    所以对于整数,它是x = x + (y % 3)

    【讨论】:

    • x += 1 应始终在语义上等同于 x = x + 1。其他任何事情都是邪恶的。
    • @SergeyA 同意,除非您已经在地狱中腐烂,否则它应该是等效的。
    猜你喜欢
    • 2016-02-14
    • 1970-01-01
    • 2015-03-28
    • 2021-07-15
    • 2021-10-27
    • 2015-11-04
    • 2016-03-25
    • 1970-01-01
    • 2018-02-14
    相关资源
    最近更新 更多