任何人都能解释一下吗?
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
才能打印出来。而且:当我用0
替换i
输出变化时怎么样?对于i
的所有值,输出似乎相同,而不仅仅是0
。
答案 0 :(得分: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
答案 1 :(得分:4)
从Java语言规范,关于类型转换和促销(参见粗体文本)
用Java编程语言编写的每个表达式都有一个类型 可以从表达式的结构和文字的类型推断出来, 变量和表达式中提到的方法。但是,有可能 在表达式类型不合适的上下文中编写表达式。 在某些情况下,这会在编译时导致错误。在其他情况下,上下文可能 能够接受与表达式类型相关的类型; 为方便起见, 而不是要求程序员明确指出类型转换, Java编程语言从类型中执行隐式转换 表达式为其周围环境可接受的类型。
在编译时发生的类型转换解释了输出。
在涉及i
的情况下,c
已提升为整数。
在涉及0
的情况下,它被视为字符,因此c
仍然是字符。