【问题标题】:Why highest priority operation [ ] is not evaluated first ini = i + arr[i++] + arr[i++]? [duplicate]为什么最高优先级操作 [ ] 不首先评估 ini = i + arr[i++] + arr[i++]? [复制]
【发布时间】:2018-02-27 16:33:35
【问题描述】:

[ ] 优先级最高(无论如何高于 +)。但在 表达式的 RHS 中,第一个(最左边的)被加数 (i) 在第二个被加数 arr1[i++] 之前计算,因为 arr1[i++] 的 i++ 不影响第一个(最左边)的值summand(i 为 1 且未更改)。

我无法严格解释为什么不首先评估更高优先级 [ ]。

int[] arr = { 0, 0, 0 };
int i = 1;
i = i + arr[i++] + arr[i++];
System.out.println(i); // output is zero

【问题讨论】:

  • 我会非常警惕这样写的代码。
  • 你为什么要写这样不可读的代码?检查你的假设。 JVM 知道它在做什么。
  • 你怎么知道操作是按特定顺序完成的?我们来看看数组的内容和i的最终值
  • 我希望这个认证问题有像z) Just don't do this -- ever.这样的答案
  • @inqi777 不,这不是你的问题。您的问题是为什么不首先评估 []。

标签: java language-lawyer operator-precedence


【解决方案1】:

见 jls Evaluate Operands before Operation:

Java 编程语言保证每个操作数 运算符(除了条件运算符 &&、|| 和 ? :) 似乎 在操作本身的任何部分被完全评估之前 执行。

和Evaluate Left-Hand Operand First

二元运算符的左侧操作数似乎是完全的 在评估右侧操作数的任何部分之前进行评估。

最左边的操作数在i++之前被评估为1。

【讨论】:

    【解决方案2】:

    坦率地说,这符合我的预期。运算符优先级似乎正确。

    鉴于此示例代码,我们预计结果不会为负数。

    int[] arr = {-1000, 100, 150};
    int i = 1;
    i = i + arr[i++] + arr[i--];
    System.out.println(i);
    

    这就是发生的事情。

    • + 关联从右到左,但优先级低于[],因此尚未调用。
    • arr[i++] 首先解析,结果为 100,与 i == 2。
    • arr[i--] 下一个解析,结果为 150,与 i == 1。
    • + 解析下一个,从左到右,并添加 150 + 100 + 1。
    • 然后答案变为251。

    所以,回答你的问题...是的,数组访问是首先发生的。

    【讨论】:

    • 请看我添加到帖子中的示例...
    • 对于你的例子,输出是 1。我不确定你在哪里弄混了 那个...
    猜你喜欢
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-26
    • 1970-01-01
    • 2021-03-05
    相关资源
    最近更新 更多