3

谁能解释一下?

public class Test {
    public static void main(String[] args) {
        char c = 'A';
        int i = 0;
        boolean b = true;

        System.out.println(b ? c : i);
        System.out.println(b ? c : (char)i);

        System.out.println(b ? c : 0);
        System.out.println(b ? c : (char)0);
    }
}

输出:

65
A
A
A

从我站的地方看,它确实看起来很奇怪。我本来希望只有As 打印出来。而且:当我替换输出变化时怎么0i?对于 的所有值,输出似乎都相同i,而不仅仅是0

4

2 回答 2

5

当您要选择苹果和橙子时,您必须宣传其中一个(较小的那个):

public class Test {
  public static void main(String[] args) {
    char c = 'A';
    int i = 0;
    boolean b = true;

    System.out.println(b ? c : i);       // Promoted to int ---> 65
    System.out.println(b ? c : (char)i); // Not promoted ------> A (char vs char)

    System.out.println(b ? c : 0);       // Not promoted vs null/0
    System.out.println(b ? c : (char)0); // Not promoted vs char
  }
}

如果有一个变量类型,nibble那么你在选择时不会得到不同的输出。

System.out.println(b ? c : (nibble)i); // I know there is no nibble. :)
                                       // nibble promotes to char.
                                       // I know... there is no nibble.
                                       //so, output is A
于 2012-09-08T16:43:56.383 回答
4

来自 Java 语言规范,关于类型转换和提升(参见粗体文本)

用 Java 编程语言编写的每个表达式都有一个类型,可以从表达式的结构以及表达式中提到的文字、变量和方法的类型推导出来。但是,可以在表达式类型不合适的上下文中编写表达式。在某些情况下,这会导致编译时出错。在其他情况下,上下文可能能够接受与表达式类型相关的类型;为方便起见,Java 编程语言不要求程序员显式指示类型转换,而是执行从表达式类型到其周围上下文可接受的类型的隐式转换。

您在编译时发生的类型转换解释了输出。

i在涉及的情况下,c已提升为整数。

在涉及的情况下0,它被视为性格,因此c仍然是性格。

于 2012-09-08T16:47:57.693 回答