在练习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
添加到 char
时,您将到达下一个 unicode 代码点。如果是 'A'
,下一个代码点是 'B'
:
char x='A';
x+=1;
System.out.println(x);
请注意,您不能使用
x=x+1
,因为它会导致隐式缩小转换。您需要使用 x++
或 x+=1
来代替。
A
char
实际上映射到 int
,请查看 Ascii 表。
例如:大写的 A 对应于十进制数 65。当您将其加 1 时,
char
,基本上就是将十进制数加 1。因此,数字变为 66,对应于大写的 B。
这是与您的程序等效的程序:
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
。
char
是数字类型(2字节长),也是Java中唯一的无符号数字原始类型。
你还可以这样做:
int foo = 'A';
这里的特别之处在于,您使用
字符常量而不是数字来初始化
char
。正如您所见,它的特别之处在于它的字符串表示形式。您可以使用 Character.digit(c, 10)
获取其数值(作为 int
,因为 2 ^ 16 - 1 不能用 short
表示!)。
您必须在使用括号添加后输入强制转换结果,如下所示:
x='A';
x = (char) (x+1);
否则你会遇到数据错误。
A
char
只是一个整数,所以可以对其进行递增/递减。每个字符编号都有一个对应的值,通过转换表将其“解释”为一个字符:无论是 ASCII 编码,还是 UTF-8 编码等。
想一想,计算机中的所有数据——图像、音乐、程序等都只是数字。简单的字符也不例外,它也被编码或编码为数字。
char
在 Java 中存储为 2 字节 unicode 值。所以如果
char x = 'A'
,就表示A
是以unicode格式存储的。在 unicode 格式中,每个字符都表示为一个整数。因此,当您说 x= x+1
时,它实际上会增加 A
的 unicode 值,从而打印 B
。所以设置
char x='A'
几乎相当于添加一个时的
int x=65
;你得到 66;或 ASCII 'B'。char
都有一个字符代码。计算机将字符视为无符号数字,因此您可以递增它。
private char getNextChar(char c) {
return (char)((c + 1 - 'a') % ('z' - 'a' + 1) + 'a');
}
这可以避免溢出。
char inp='A';
inp+=1;
System.out.println(inp);
//输出=B