这个表达式的结果不是我学到的

问题描述 投票:0回答:1

在下面的代码中,结果是-6。为什么?

`    int x = 5;
    int y = 3;
    int result = x++ - (--y + ++x) - y--;`

我认为首先计算括号内的值,然后按照从左到右的顺序计算括号外的值,但这样,结果就不会是-6。 我认为这是顺序:

  1. ++x
  2. --y
  3. x++
  4. y--
  5. 第一个 - 从左起
    • 在表情中间
  6. 最后一个 - 从左起

数字 1 的值为 6,x 为 6

数字 2 中的值是 2,y 是 2

数字 3 的值为 6,x 为 7

数字 4 的值为 2,y 为 1

数字 5,6,7 的表达式是 6 - 8 - 2 = -4,不等于 -6;

就运算符优先级和运算符结合性而言

c# expression operator-precedence associativity
1个回答
0
投票

引用 C# 规范(ECMA-334,第 6 版,2022 年 6 月,§11.4.1):

表达式中的操作数是从左到右计算的。

这意味着您最初的假设不正确:“我认为首先,对括号内的内容进行了评估”。

在这种情况下,将首先评估

x++
;序列看起来像这样:

  1. x++
    被评估,返回 5,但在 x
  2. 中保存 6 计算
  3. --y
    ,在 y
  4. 中保存 2 计算
  5. ++x
    ,返回 7(因为
    x
    是上一次操作中的 6)
  6. 括号中的内容被评估 (2 + 7) = 9
  7. 计算第一个减法
    5
    (来自步骤 1)。
    -
    9
    (来自步骤 4)=
    -4
  8. y--
    被评估,返回 2,但在 y
  9. 中保存 1
  10. 计算最终减法,
    -4
    (来自步骤 5)。
    -
    2
    (来自步骤 6)=
    -6

正如其中一条评论中提到的(优先级、关联性、顺序),区分以下各项非常重要:

  • 优先级规则描述了当表达式混合不同类型的运算符时,下括号表达式应如何加上括号

  • 关联性规则描述了当表达式具有一堆相同类型的运算符时,应如何为带下括号的表达式添加括号

  • 求值顺序规则描述了表达式中每个操作数的求值顺序

© www.soinside.com 2019 - 2024. All rights reserved.