我在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,很奇怪,任何人都可以解决这个问题吗?
对我来说理解三元运算符会很有帮助.
提前致谢!
这种行为的原因是三元组有一种结果类型,编译器必须提前选择,以及print响应中调用的风格.
在这种true ? x : 0情况下,0被视为一个char值,并被print(char)调用.在第二种情况下,既然i是a int,x也是隐式转换为int(扩展转换)并被print(int)调用,产生数字输出.相反,铸造i于char含蓄,是非法的,因为它可能会失去精度.
静态解析类型的含义可以通过这个例子来显示 - 不是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 <?>)",但重点是.
| 归档时间: |
|
| 查看次数: |
695 次 |
| 最近记录: |