📜  Java三元运算符之谜

📅  最后修改于: 2022-05-13 01:55:05.604000             🧑  作者: Mango

Java三元运算符之谜

找到程序的输出

public class GFG {
    public static void main(String[] args) {
    char x = 'X';
    int i = 0;
    System.out.print(true ? x : 0);
    System.out.print(false ? i : x);
    }
}

解决方案:
如果你运行这个程序,你会发现它打印了X88 。第一个 print 语句打印 X,第二个打印 88。

确定条件表达式结果类型的规则太长太复杂,无法完整重现,但这里有三个关键点。

  1. 如果第二个和第三个操作数的类型相同,那就是条件表达式的类型。换句话说,您可以通过避开混合类型的计算来避免整个混乱。
  2. 如果其中一个操作数是 T 类型,其中 T 是 byte、short 或 char,而另一个操作数是 int 类型的常量表达式,其值可在 T 类型中重新表示,则条件表达式的类型是 T。
  3. 否则,二进制数值提升应用于操作数类型,条件表达式的类型是第二个和第三个操作数的提升类型。

第 2 点和第 3 点是这个谜题的关键。在程序的两个条件表达式中,一个操作数是 char 类型,另一个是 int 类型。在这两个表达式中,int 操作数的值都是 0,可以表示为 char。然而,只有第一个表达式中的 int 操作数是常量 (0);第二个表达式中的 int 操作数是变量 (i)。因此,第 2 点适用于第一个表达式,其返回类型为 char。第 3 点适用于第二个条件表达式,其返回类型是对 int 和 char 应用二进制数值提升的结果,即 int。

条件表达式的类型决定了调用 print 方法的哪个重载。对于第一个表达式,调用 PrintStream.print(char);第二个,PrintStream.print(int)。前者重载将变量 x 的值打印为 Unicode字符(X),而后者将其打印为十进制整数 (88)。