为什么以下Java程序会产生奇怪的输出?

Jam*_*ani 4 java puzzle

我在Java Puzzlers中找到了下面的谜题,

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

我尝试了这个代码并运行它但输出不是按照我的猜测来的,

我的猜测输出应该是:XX
实际上输出是:X88

我努力了解但我不能,任何人都能给我们解释一下吗?为什么不同的产出即将到来?因为我能够理解第一个print()将打印变量char x字符值,但第二个print()打印88ASCII值表示在char x.if我简化三元运算符表达式在第二个print()像这样

if(false){
    System.out.print(i);
}else{
    System.out.print(x);
}
Run Code Online (Sandbox Code Playgroud)

然后输出即将到来XX,很奇怪,任何人都可以解决这个问题吗?

对我来说理解三元运算符会很有帮助.

提前致谢!

Sil*_*eak 6

这种行为的原因是三元组有一种结果类型,编译器必须提前选择,以及print响应中调用的风格.

在这种true ? x : 0情况下,0被视为一个char值,并被print(char)调用.在第二种情况下,既然i是a int,x也是隐式转换为int(扩展转换)并被print(int)调用,产生数字输出.相反,铸造ichar含蓄,是非法的,因为它可能会失去精度.

静态解析类型的含义可以通过这个例子来显示 - 不是print因为有一个print(Object),但考虑到这个:

void method(boolean b);
void method(Integer i);
...
method(cond? false:0);
Run Code Online (Sandbox Code Playgroud)

无论是什么cond,都存在与参数兼容的过载.但是,编译器需要选择一个重载,这在编译时是不可能的.编译器将自动进行同步并将表达式指定为Object*,但没有method(Object).


*实际上,我的编译器说"类型Test中的方法方法(布尔值)不适用于参数(Object&Serializable&Comparable <?>)",但重点是.