java - 为什么下面的 Java 程序会给出奇怪的输出?

标签 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); 
    }
}

我尝试了这段代码并也运行了它,但输出并没有按照我的猜测出现,

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

我试了很多但我不能,任何人都可以给我们解释吗?为什么会出现不同的输出?因为我能够理解第一个 print() 将打印变量 char x 字符值,但是第二个 print() 打印 88 char x 中值的 ASCII 表示。如果我像这样简化第二个 print() 中的三元运算符表达式

if(false){
    System.out.print(i);
}else{
    System.out.print(x);
}

然后输出是XX,很奇怪,谁能解决这个问题?

理解三元运算符对我有很大帮助。

提前致谢!

最佳答案

此行为的原因是三元具有编译器必须提前选择的一种结果类型,并且响应时调用了 print 的风格。

中是真的吗? x : 0 情况下,0 被视为 char 值,并调用 print(char)。在第二种情况下,由于 i 是一个 intx 也被隐式转换为 int(扩大转换) 和 print(int) 被调用,产生数字输出。相反,将 i 隐式转换为 char 是非法的,因为它可能会丢失精度。

静态解析类型的含义可以用这个例子来展示——而不是用print,因为有一个print(Object),但是考虑一下:

void method(boolean b);
void method(Integer i);
...
method(cond? false:0);

无论cond 是什么,都有一个与参数兼容的重载。但是,编译器需要选择一个重载,这在编译时是不可能的。编译器将自动装箱并将表达式分配为 Object*,但没有 method(Object)


*实际上,我的编译器说“类型 Test 中的方法 method(boolean) 不适用于参数 (Object&Serializable&Comparable)”,但这一点是成立的。

关于java - 为什么下面的 Java 程序会给出奇怪的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24647890/

相关文章:

algorithm - 帮助理解埃拉托色尼筛法的实现

java - 如何在 Eclipse 中使用 Jfreechart 绘制实时/动态值的图表

从一组 n 个球中找出有缺陷的球所需的最小权重数的算法

java - 性能影响打开和关闭文件处理程序?

java - Injectmocks 无法实例化,因为找不到线程绑定(bind)请求

Java HashSet 和数据类型 Short,不兼容?

algorithm - 如何以编程方式解决九九之谜?

algorithm - 其他游戏“Quarth”的算法

java - Java 中是否可以仅在一个输出中显示 for 循环的结果?

java - 如何解决Error : java. lang.ClassNotFoundException : io.netty.util.concurrent.GenericFutureListener?