代码之家  ›  专栏  ›  技术社区  ›  Tom Ritter

int x=10;x+=x--;在.Net中-为什么?

  •  33
  • Tom Ritter  · 技术社区  · 16 年前
    int x = 10;
    x += x--;
    

    (我故意把答案漏掉,这样你就可以猜猜看你是不是对了)

    5 回复  |  直到 16 年前
        1
  •  53
  •   Jon Skeet    16 年前

    看看这句话:

    x += x--;
    

    这相当于:

    x = x + x--;
    

    相当于:

    int a1 = x; // a1 = 10, x = 10
    int a2 = x--; // a2 = 10, x = 9
    x = a1 + a2; // x = 20
    

    所以 x 之后是20-这是由规格保证的。

    什么 几乎可以保证的是,尽管规范没有规定,但是任何使用这种代码的人都会受到同事的攻击。是的,结果是可以预测的,这很好。不,这样不好 使用 那种代码。

        2
  •  15
  •   Eric Lippert    16 年前

    思考这个问题的一个好方法是记住:

    从左到右 . 时期亚表达的评估可能会引起副作用。

    2) 运算符的执行总是按照括号、优先级和关联性指示的顺序进行。执行运算符可能会产生副作用。

    +=右边的x--是从左到右顺序的下一个,所以接下来对它求值。x的值——是10,副作用是x变成9,这是它应该的,因为——的优先级高于+=,所以它的副作用首先运行。

    最后,+=的副作用会持续到最后。两个操作数分别是10和10,因此结果是将20赋给x。

    我一直都有关于这个的问题。记住,规则非常简单:从左到右的子表达式,按优先顺序的运算符,句点。

    http://blogs.msdn.com/ericlippert/archive/tags/precedence/default.aspx

        3
  •  14
  •   bryanjonker    16 年前

    20; “-”直到所有内容都被求值之后才会发生,并且该值被equals的左侧覆盖。

        4
  •  10
  •   Mark Byers    16 年前

    specs 7.13.2

    如果所选运算符的返回类型可隐式转换为x类型,则该操作的计算结果为x=x op y,但x只计算一次。

    所以你的陈述相当于 x = x + x--;

    请注意,这两者之间也有区别 --x x-- 在这里如果你写过 x += --x; 这相当于 x = x + --x ; 然后得到19,这是因为x的值被递减,得到的值被用在表达式中(不像 十-- 表达式中使用了x的原始值)。

    这个表达式 x = x + --x + x 会给28因为 第三次 第四次(见注释)x被评估为9。

        5
  •  0
  •   Eric    16 年前

    推荐文章