Java中的递增字符类型
Posted
技术标签:
【中文标题】Java中的递增字符类型【英文标题】:Incrementing Char Type In Java 【发布时间】:2013-06-12 01:51:07 【问题描述】:在练习 Java 时,我随机想到了这个:
class test
public static void main(String arg[])
char x='A';
x=x+1;
System.out.println(x);
我以为它会抛出一个错误,因为我们不能将数值1
添加到数学中的字母A
,但是下面的程序运行正确并打印了
B
这怎么可能?
【问题讨论】:
x
是 'B'
的字符和 Unicode 值 = 'A'
的 Unicode 值 + 1
您将 int 添加到 char 的 ASCII 码中,而不是添加到 char 本身。
我希望我们可以在 Java 的上下文中摆脱 ASCII 一词。 Java 自 1995 年问世以来一直在使用 Unicode。 #Grumpymorning。
试试这个x *= 1.1;
,它也可以编译。 ;)
引用的程序无法编译。它有两个错误,缺少一个“;”,并且需要将增量的结果转换回 char。
【参考方案1】:
因为 char 类型有效地像 16 位 unsigned int 一样工作。
所以设置char x='A'
几乎等同于int x=65
加一个;你得到66;或 ASCII 'B'。
【讨论】:
什么?!?不是一个字节。请检查 Java 定义。 它确实不像 16 位 int 一样工作。char
未签名,short
未签名。
感谢您对改进答案的意见。
@fge +1。任何有兴趣的人:docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.1【参考方案2】:
char
是数字类型(2字节长),也是Java中唯一的无符号数字原始类型。
你也可以这样做:
int foo = 'A';
这里的特别之处在于您使用字符常量而不是数字来初始化char
。正如您所见,它的特别之处在于它的字符串表示。您可以使用Character.digit(c, 10)
获取其数值(作为int
,因为short
无法表示2 ^ 16 - 1!)。
【讨论】:
【参考方案3】:在 Java 中,char
是数字类型。当您将1
添加到char
时,您将获得下一个unicode code point。如果是'A'
,下一个代码点是'B'
:
char x='A';
x+=1;
System.out.println(x);
请注意,您不能使用x=x+1
,因为它会导致隐式缩小转换。您需要改用x++
或x+=1
。
【讨论】:
感谢您提及隐式缩小转换。【参考方案4】:每个char
都有一个字符代码。计算机将字符视为无符号数,因此您可以递增它。
【讨论】:
【参考方案5】:Java 中的char
只是一个整数,因此可以递增/递减它。每个字符数都有一个对应的值,将其解释为一个字符,借助转换表:ASCII 编码,或 UTF-8 编码等。
想一想,计算机中的每一个数据——图像、音乐、程序等都只是数字。一个简单的字符也不例外,它也被编码或编码为数字。
【讨论】:
【参考方案6】:char
在 Java 中存储为 2 字节的 unicode 值。所以如果char x = 'A'
,则表示A
是以unicode格式存储的。在 unicode 格式中,每个字符都表示为一个整数。所以当你说x= x+1
时,它实际上增加了A
的unicode值,它打印B
。
【讨论】:
【参考方案7】:这是你的程序的等效程序:
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
。
【讨论】:
【参考方案8】:char
实际上映射到int
,看看Ascii Table。
例如:一个大写的A对应十进制数65。当你在那个char
上加1时,你基本上是把十进制数加1。所以数字变成了66,对应的是大写的B。
【讨论】:
感谢链接,现在我明白 java 将 char 视为数字【参考方案9】:您必须在使用括号添加后键入转换结果,如下所示:
x='A';
x = (char) (x+1);
否则您将摆脱数据错误。
【讨论】:
【参考方案10】:如果您希望它只是 a-z。
private char getNextChar(char c)
return (char)((c + 1 - 'a') % ('z' - 'a' + 1) + 'a');
这样可以避免溢出。
【讨论】:
以上是关于Java中的递增字符类型的主要内容,如果未能解决你的问题,请参考以下文章