在练习Java时,我随机想出了这个:
class test
{
public static void main(String arg[])
{
char x='A';
x=x+1;
System.out.println(x);
}
}
我认为它会引发错误,因为我们无法在数学中将数字1
添加到字母A
,但以下程序正确运行并打印
B
这怎么可能?
答案 0 :(得分:29)
在Java中,char
是一种数字类型。将1
添加到char
后,您将转到下一个unicode code point。如果是'A'
,则下一个代码点为'B'
:
char x='A';
x+=1;
System.out.println(x);
请注意,您无法使用x=x+1
,因为它会导致隐式缩小转化。您需要使用x++
或x+=1
代替。
答案 1 :(得分:5)
char
实际上已映射到int
,请查看Ascii Table。
例如:大写字母A对应于十进制数字65.当您向char
添加1时,基本上将十进制数字增加1.因此数字变为66,对应于大写字母B
答案 2 :(得分:3)
char
是一种数字类型(长度为2个字节),也是Java中唯一的无符号数字基元类型。
你也可以这样做:
int foo = 'A';
这里特别的是您使用字符常量而不是数字初始化char
。正如你所见,它的特殊之处在于它的字符串表示。您可以使用Character.digit(c, 10)
获取其数值(作为int
,因为short
无法表示2 ^ 16 - 1。
答案 3 :(得分:3)
这是您的计划的等效程序:
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
。
答案 4 :(得分:2)
Java中的char
只是一个整数,所以可以递增/递减它。每个字符编号都有一个对应的值,它的解释作为一个字符,凭借转换表:无论是ASCII编码,还是UTF-8编码等。
想想看,计算机中的每一个数据 - 图像,音乐,程序等都只是数字。一个简单的字符也不例外,它的编码或编码也是一个数字。
答案 5 :(得分:2)
char
在Java中存储为2字节的unicode值。因此,如果char x = 'A'
,则表示A
以unicode格式存储。在unicode格式中,每个字符都表示为整数。因此,当您说x= x+1
时,它实际上会增加A
的unicode值,后者会打印B
。
答案 6 :(得分:2)
你必须在使用括号添加后输入结果:
x='A';
x = (char) (x+1);
否则你将失去数据错误。
答案 7 :(得分:0)
因为类型char有效地像16位unsigned int一样工作。
所以设置char x='A'
几乎相当于int x=65
当你添加一个;你得到66;或ASCII'B'。
答案 8 :(得分:0)
每个char
都有一个字符代码。计算机将字符视为无符号数字,因此您可以将其递增。
答案 9 :(得分:0)
如果您希望它只是a-z。
private char getNextChar(char c) {
return (char)((c + 1 - 'a') % ('z' - 'a' + 1) + 'a');
}
这可以避免它溢出。