三目运算中的数据类型相关问题
public
class Test{
public
static
void main(String[] args) {
int
a = 5;
//double i = a < 5 ? 8.5 : 9;
System.out.println(“结果是: “ +(a < 5 ? 8.5 : 9));//输出结果是9.0
//为什么输出结果是9.0而不是9?
//原因:因为三目运算中8.5为double类型,而9为int类型,这时java就会根据运算符的精度类型进行自动转换,由于double精度类型高于int,故把int转为double数据类型。
char
x = ‘x’;
int
i = 10;
int
b = (int)‘中‘;
System.out.println(b);
System.out.println(false ? i : x);//结果一输出为:120
System.out.println(false ? 10 : x);//结果二输出为😡
System.out.println(true ? 33: x);//结果三输出为:!
System.out.println(true ? 20013: x);//结果四输出为:中
System.out.println(true ? 6.9: x);//结果五输出为:6.9
/*
对于结果一,由于i是一个int类型的变量,因此第一个输出x被提升为int类型了,又x的int值为120,故输出结果为120;
对于结果二,java编程规范中提到:在三目运算中,当后两个表达式中有一个是常量表达式时(本题中的10),另一个类型T(本题中是char)时,
而常量表达式可以被T表示时(representable in tape T),输出结果为T类型;
对于结果三,输出为感叹号(!),是由于33在Unicode码表中对应于!;此处涉及到char类型对应的码表,下图只简单列出开始的ASCLL码表:
对于结果四,输出为中,是由于char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,而中国的“中“在unicode编码字符集中对应于20013;
对于结果五,由于6.9默认为double数据类型,而且不可以用T(即本题中的char)表示,故结果为6.9;
*/
}
}
补充知识:
Unicode码扩展自ASCII字元集, 它前128个字符就是ASCII码,之后是扩展码。在严格的ASCII中,每个字元用7位元表示,或者电脑上普遍使用的每字元有8位元宽;而Unicode使用全16位元字元集。这使得Unicode能够表示世界上所有的书写语言中可能用於电脑通讯的字元、象形文字和其他符号。Unicode最初打算作为ASCII的补充,可能的话,最终将代替它。考虑到ASCII是电脑中最具支配地位的标准,所以这的确是一个很高的目标。
ASCLL码表
ASCII值 |
控制字符 |
ASCII值 |
控制字符 |
ASCII值 |
控制字符 |
ASCII值 |
控制字符 |
0 |
NUT |
32 |
(space) |
64 |
@ |
96 |
、 |
1 |
SOH |
33 |
! |
65 |
A |
97 |
a |
2 |
STX |
34 |
“ |
66 |
B |
98 |
b |
3 |
ETX |
35 |
# |
67 |
C |
99 |
c |
4 |
EOT |
36 |
$ |
68 |
D |
100 |
d |
5 |
ENQ |
37 |
% |
69 |
E |
101 |
e |
6 |
ACK |
38 |
& |
70 |
F |
102 |
f |
7 |
BEL |
39 |
, |
71 |
G |
103 |
g |
8 |
BS |
40 |
( |
72 |
H |
104 |
h |
9 |
HT |
41 |
) |
73 |
I |
105 |
i |
10 |
LF |
42 |
* |
74 |
J |
106 |
j |
11 |
VT |
43 |
+ |
75 |
K |
107 |
k |
12 |
FF |
44 |
, |
76 |
L |
108 |
l |
13 |
CR |
45 |
– |
77 |
M |
109 |
m |
14 |
SO |
46 |
. |
78 |
N |
110 |
n |
15 |
SI |
47 |
/ |
79 |
O |
111 |
o |
16 |
DLE |
48 |
0 |
80 |
P |
112 |
p |
17 |
DCI |
49 |
1 |
81 |
Q |
113 |
q |
18 |
DC2 |
50 |
2 |
82 |
R |
114 |
r |
19 |
DC3 |
51 |
3 |
83 |
X |
115 |
s |
20 |
DC4 |
52 |
4 |
84 |
T |
116 |
t |
21 |
NAK |
53 |
5 |
85 |
U |
117 |
u |
22 |
SYN |
54 |
6 |
86 |
V |
118 |
v |
23 |
TB |
55 |
7 |
87 |
W |
119 |
w |
24 |
CAN |
56 |
8 |
88 |
X |
120 |
x |
25 |
EM |
57 |
9 |
89 |
Y |
121 |
y |
26 |
SUB |
58 |
: |
90 |
Z |
122 |
z |
27 |
ESC |
59 |
; |
91 |
[ |
123 |
{ |
28 |
FS |
60 |
< |
92 |
/ |
124 |
| |
29 |
GS |
61 |
= |
93 |
] |
125 |
} |
30 |
RS |
62 |
> |
94 |
^ |
126 |
~ |
31 |
US |
63 |
? |
95 |
— |
127 |
DEL |
NUL 空 |
VT 垂直制表 |
SYN 空转同步 |
SOH 标题开始 |
FF 走纸控制 |
ETB 信息组传送结束 |
STX 正文开始 |
CR 回车 |
CAN 作废 |
ETX 正文结束 |
SO 移位输出 |
EM 纸尽 |
EOY 传输结束 |
SI 移位输入 |
SUB 换置 |
ENQ 询问字符 |
DLE 空格 |
ESC 换码 |
ACK 承认 |
DC1 设备控制1 |
FS 文字分隔符 |
BEL 报警 |
DC2 设备控制2 |
GS 组分隔符 |
BS 退一格 |
DC3 设备控制3 |
RS 记录分隔符 |
HT 横向列表 |
DC4 设备控制4 |
US 单元分隔符 |
LF 换行 |
NAK 否定 |
DEL 删除 |