繁体   English   中英

使用三元运算符和最终变量时出现意外输出

[英]Unexpected output when using a ternary operator and final variable

请考虑以下代码段:

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规范 ,我们发现了

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

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

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

在第二种情况下, z2计为常量表达式 ,因为它是int类型的最终变量。

4.12.4节

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

第15.28节包括可用于形成常量表达式的项集合中的“常量变量”。

z1 不是最终变量(即使没有其他任何值赋值),因此它不是常量变量,因此不是常量表达式 - 因此您从规范中引用的段落不适用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM