在练习 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');
}
这避免了它溢出。