【发布时间】:2016-01-19 21:39:50
【问题描述】:
”0123”.charAt(0) - '0' 返回一个整数。这个整数是什么(为什么是这个整数),一般为什么char-char = int?
【问题讨论】:
-
'0' - '1' 是什么字符?
-
它使用字符的 ascii 值。
-
@wero:
-SOH(标题的负开始)当然:)
”0123”.charAt(0) - '0' 返回一个整数。这个整数是什么(为什么是这个整数),一般为什么char-char = int?
【问题讨论】:
-SOH(标题的负开始)当然:)
为什么是这个整数
因为编译器不能保证操作的结果会产生一个有效的字符值。由于字符、字节和整数都是隐式可互换的……而且由于整数是这三个中唯一一个包含所有三个可能值的超集……默认转换为整数。
@wero 在对上述问题的评论中说明了这一点:
'0' - '1' 是什么字符?
也就是说,如果你从一个较低的字符中减去一个较高的字符,那么你就会有一个否定的字符。这是无效的。但是,负整数是有效的。
或者考虑一个字节...如果将字节 250 添加到 250 会怎样?两者都是有效字节,但结果值不是有效字节。 (因为它是两个字节宽。)所以需要一个整数来包含它。
对于编译器可以保证生成值的常量表达式,可能存在(现在或将来)足够聪明的编译器来维护它。 (他们甚至可能会将其优化为编译时常量,而不是代码中的表达式。)例如:
`1` - `0`
但是,即使这样的编译器在使用 .charAt() 之类的东西时默认返回为整数,我也不会感到惊讶,因为它不再是一个常量表达式。作为人类,我们可以直观地推断出该表达式的恒定结果。但是编译器需要严格而简单的规则,引入方法调用会使这些规则相当复杂。
【讨论】:
因为字符是用整数编码的。见ASCII table。
例如:
int code = 99;
char c = 'c';
int cc = (int) c; //int cc = 99
char sixty_seven = Integer.toString(code).charAt(0); //the char c
”0123”.charAt(0) – '0' is: 从字符串"0123" 中使用charAt(index) 方法从字符串中取出第一个字符,即0。然后我们查看ASCII表,看到0是48。那么减法后得到48-48 = 0。
这是可能的,因为 JAVA 非常基于 C,其中没有字符串(字符串是一个 对象)。 “字符串”可以读取为 char 数组。 C 中的 int 和 chars 在各自的范围内是可以互换的(chars 是整数类型)。
【讨论】:
Java char 拥有一个 Unicode/UTF-16 代码单元。许多 Unicode 代码点在其 UTF-16 编码中只需要一个代码单元,并且这些代码单元的范围很广。因此,在这些范围内,char 值可以被视为代码点。
char 值之间的减法给出了它们之间的“距离”,这在处理少数“组织良好”的代码点序列时非常有用,例如基本拉丁字母(A-Z 或 a-z)。知道四分音符和二分音符或笑脸和眨眼之间的“距离”通常没有用处,......
结果是一个整数,因为连续整数列表上的距离是用整数来衡量的。
同样,这种技术仅在非常严格的情况下才有效。总是有一种较少限制的方法来做到这一点。
另请参阅java.lang.Character 类的文档。
【讨论】: