【问题标题】:I am expecting the output to be 40 but i got 30我期望输出为 40 但我得到了 30
【发布时间】:2016-12-02 08:10:59
【问题描述】:
class Tester {
    public static void main(String[] arg) {
        byte b=10;
        b +=(b<127)?b>-128? b+=10 :0 :5;
        System.out.println(b);
    }
}

我知道条件已评估 true 并将控制权转移到 b+=10 所以现在逻辑上b+=b+=10; 将 b 和 10 的值相加,计算结果为 20,分配给 b。现在我无法进一步评估它。

【问题讨论】:

  • 请更清楚地格式化你的代码,看看上面我是怎么做的
  • 那句话是怎么回事?您在同一行中有 2 个作业...
  • 首先计算左侧,即10,然后是右侧,即(10 + 10) = 20,然后将右侧添加到左侧并存储再次在b,所以那是10+20 = 30
  • 谢谢....@ErwinBolwidt

标签: java operators


【解决方案1】:

首先评估(b&lt;127),它是true,因此它移动到部分b&gt;-128? b+=10 在此 b&gt;-128 被评估,这也是 true 所以它移动到 b+=10 这使得 b=20 并添加到表达式的左侧,其中 10 的值存储在 b 中。所以 b+=(b=20) 使得 @987654328 @

【讨论】:

  • 如果是这种情况,那么 b=20 使 b 等于 20,然后b += (b=20) 将使其等于 40。关键的一步是,首先要做的是原始b 的值被保存 (10),并且复合赋值运算符将表达式右侧的值添加到左侧的原始保存值。
【解决方案2】:

JLS 15.7.1. Evaluate Left-Hand Operand First 也有类似的例子:

如果运算符是复合赋值运算符(第 15.26.2 节),则 左侧操作数的评估包括 记住左侧操作数表示的变量 和 获取并保存该变量的值以用于隐含的二元运算。

示例 15.7.1-2。复合赋值运算符中的隐式左手操作数

在下面的程序中,两个赋值语句都获取并记住左侧操作数的值,即 9,加法运算符的右侧操作数之前是评估,此时变量设置为3。

class Test2 {
    public static void main(String[] args) {
        int a = 9;
        a += (a = 3);  // first example
        System.out.println(a);
        int b = 9;
        b = b + (b = 3);  // second example
        System.out.println(b);
    }
}

这个程序产生输出:

12
12

因此,在您的情况下,b (10) 的原始值被记住并添加到三元条件运算符的结果中(即 20,因为 b+=10 的值是该表达式的结果) ,给你 30。

【讨论】:

    猜你喜欢
    • 2022-07-25
    • 2022-01-24
    • 2020-08-04
    • 1970-01-01
    • 2019-08-26
    • 1970-01-01
    • 1970-01-01
    • 2015-12-01
    • 1970-01-01
    相关资源
    最近更新 更多