请查看以下代码
int a =10;
int b =20;
System.out.println((a>b)?'a':65);//A
System.out.println((a>b)?a:65);//65
System.out.println((a>b)?"a":65);//65
有人可以解释一下为什么显示" A"如果我将变量'a'
作为一个字符?如果我将"a"
作为字符串,它应该显示65?
答案 0 :(得分:3)
此行为记录在JLS - 15.25. Conditional Operator ? ::
中如果其中一个操作数是T类型,其中T是byte,short或char,另一个操作数是int类型的常量表达式(§15.28),其值可以在类型T中表示,那么条件表达式的类型是T
写作时
(a > b) ? 'a' : 65
第二种类型转换为char
。
通过JLS,它解释了其他情况下的行为(相同的方法)。
答案 1 :(得分:0)
当你的行System.out.println((a>b)?'a':65);//A
被执行时,JVM会发现你的情况是假的,所以它会输出65.现在,你提供了一个' a'作为第一个可能的输出,65将被转换为char和' A'将返回,其ASCII值为65。
答案 2 :(得分:0)
Ternary Operator就像if-then-else语句一样工作。由于JLS第15.25节中提到的条件运算符的自动装箱/拆箱规则,您获得这些结果
第一行 System.out.println((a> b)?'a':65); 条件为假,否则将打印块 else块的值被视为 char ,因为如果block包含 char 变量。
第二行 System.out.println((a> b)?a:65); 条件为假,否则将打印块 else块的值被视为 int ,因为如果块包含 int 变量。这里65是int值。
第三行 System.out.println((a> b)?“a”:65); 条件为假,否则将打印块 else块的值被视为 String ,因为if块包含 String 变量。这里65是一个String而不是int。
我检查过JLS。有关更多信息,请参阅此处的官方JLS