在练习 Java 时,我随机想到了这个:
class test
{
public static void main(String arg[])
{
char x='A';
x=x+1;
System.out.println(x);
}
}
我以为它会抛出一个错误,因为我们无法将数值添加1
到数学中的字母A
,但以下程序运行正确并打印
B
这怎么可能?
在 Java 中,char
是数字类型。当您添加1
到 achar
时,您将进入下一个unicode 代码点。在 的情况下'A'
,下一个代码点是'B'
:
char x='A';
x+=1;
System.out.println(x);
请注意,您不能使用x=x+1
,因为它会导致隐式缩小转换。您需要使用x++
或x+=1
代替。
Achar
其实映射到了int
,看Ascii 表。
例如:一个大写的A对应十进制数65。当你给它加1时char
,你基本上是把十进制数加1。所以数字变成了66,对应的是大写B。
char
是数字类型(2 字节长),也是 Java 中唯一的无符号数字原始类型。
你也可以这样做:
int foo = 'A';
这里的特别之处在于您char
使用字符常量而不是数字来初始化 。正如您所见,它的特别之处在于它的字符串表示。您可以使用Character.digit(c, 10)
来获取它的数值(作为int
,因为 2 ^ 16 - 1 不能用short
! 表示)。
这是您的程序的等效程序:
public class Tester {
public static void main(String args[]){
char start='\u0041';
char next='\u0041'+1;
System.out.println(next);
}
}
但如您所见,next=start+1
, 将不起作用。这就是java处理的方式。
原因可能是我们可能不小心使用start
, 整数1
思维start
是一个int
变量并使用该表达式。因为,java 对于最小化逻辑错误非常严格。他们是按照我的想法设计的。
但是,当您这样做时,char next='\u0041'+1;
很明显这'\u0041'
是一个字符,并且1
将被隐式转换为 2 个字节。这是程序员不会犯的错误。可能这就是他们允许的原因。
char
在java中是2个字节。char
支持unicode
字符。当您添加或减去带有偏移整数的 char var 时,unicode
将产生 unicode 表中的等效字符。既然,B
是旁边A
,你得到了B
。
您必须在使用括号添加后键入结果,如下所示:
x='A';
x = (char) (x+1);
否则您将摆脱数据错误。
Java 中的Achar
只是一个整数,因此可以递增/递减它。每个字符数都有一个对应的值,将其解释为一个字符,通过一个转换表:无论是 ASCII 编码,还是 UTF-8 编码等。
想一想,计算机中的每一个数据——图像、音乐、程序等,都只是数字。一个简单的字符也不例外,它也被编码或编码为一个数字。
char
在 Java 中存储为 2 字节的 unicode 值。因此,如果char x = 'A'
,则表示A
以 unicode 格式存储。在 unicode 格式中,每个字符都表示为一个整数。因此,当您说时x= x+1
,它实际上增加了A
打印的 unicode 值B
。
因为 char 类型实际上像 16 位 unsigned int 一样工作。
所以设置char x='A'
几乎等同于int x=65
当你加一个;你得到66;或 ASCII 'B'。
每个char
都有一个字符代码。计算机将字符视为无符号数字,因此您可以递增它。
如果您希望它只是 az。
private char getNextChar(char c) {
return (char)((c + 1 - 'a') % ('z' - 'a' + 1) + 'a');
}
这避免了它溢出。