【问题标题】:Unexpected output when using a ternary operator and final variable使用三元运算符和最终变量时的意外输出
【发布时间】:2011-06-10 07:58:26
【问题描述】:

考虑这段代码sn-p:

public static void main(String[] args) {
    int z1 = 0;
    final int z2 = 0;
    System.out.println(false ? z1 : 'X');
    System.out.println(false ? z2 : 'X');
}

运行此代码时,我希望在您的控制台中看到两个X。然而,真正的输出是:

88
X

如果我们查看Java specifications regarding the ternary operator,我们会发现

如果其中一个操作数是 T 类型,其中 T 是 byte、short 或 char,而另一个操作数是 int 类型的常量表达式,其值可以用类型 T 表示,则条件表达式的类型是 T .

所以第一个输出将'X' 字符视为int,这就是它打印88 的原因。

但是,我不确定为什么使用 final 会改变第二个输出的行为。

【问题讨论】:

  • 顺便说一句,这是我今天第二次看到有人有效地假设他们期望看到的就是每个人其他 i> 期待看到。我认为说“在运行这段代码时,我希望看到...”会更合适
  • @Jon,你是对的。问题已编辑。

标签: java final ternary-operator


【解决方案1】:

在第二种情况下,z2 算作constant expression,因为它是int 类型的最终变量。

来自section 4.12.4

我们将原始类型或 String 类型的变量称为 final 并使用编译时常量表达式(第 15.28 节)初始化的变量为常量变量。变量是否为常量变量可能对类初始化(第 12.4.1 节)、二进制兼容性(第 13.1 节、第 13.4.9 节)和明确赋值(第 16 节)有影响。

Section 15.28 在可用于形成常量表达式的项目集中包含“常量变量”。

z1not 最终变量(即使没有其他任何东西为它赋值)所以它不是一个常量变量,因此不是一个常量表达式 - 所以你引用的段落规范不适用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-31
    • 2016-03-10
    • 2012-12-11
    • 2020-05-21
    • 1970-01-01
    • 1970-01-01
    • 2017-03-05
    • 1970-01-01
    相关资源
    最近更新 更多