30

在练习 Java 时,我随机想到了这个:

class test
{
    public static void main(String arg[])
    {
        char x='A';
        x=x+1;
        System.out.println(x);
    }
}

我以为它会抛出一个错误,因为我们无法将数值添加1到数学中的字母A,但以下程序运行正确并打印

B 

这怎么可能?

4

10 回答 10

47

在 Java 中,char是数字类型。当您添加1到 achar时,您将进入下一个unicode 代码点。在 的情况下'A',下一个代码点是'B'

char x='A';
x+=1;
System.out.println(x);

请注意,您不能使用x=x+1,因为它会导致隐式缩小转换。您需要使用x++x+=1代替。

于 2013-06-15T15:09:01.583 回答
5

Achar其实映射到了int,看Ascii 表

例如:一个大写的A对应十进制数65。当你给它加1时char,你基本上是把十进制数加1。所以数字变成了66,对应的是大写B。

于 2013-06-15T15:17:23.487 回答
4

char 数字类型(2 字节长),也是 Java 中唯一的无符号数字原始类型。

你也可以这样做:

int foo = 'A';

这里的特别之处在于您char使用字符常量而不是数字来初始化 。正如您所见,它的特别之处在于它的字符串表示。您可以使用Character.digit(c, 10)来获取它的数值(作为int,因为 2 ^ 16 - 1 不能用short! 表示)。

于 2013-06-15T15:08:58.187 回答
4

这是您的程序的等效程序:

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

于 2013-06-15T15:14:06.050 回答
4

您必须在使用括号添加后键入结果,如下所示:

x='A';
x = (char) (x+1);

否则您将摆脱数据错误。

于 2016-03-04T21:01:29.020 回答
2

Java 中的Achar只是一个整数,因此可以递增/递减它。每个字符数都有一个对应的值,将其解释为一个字符,通过一个转换表:无论是 ASCII 编码,还是 UTF-8 编码等。

想一想,计算机中的每一个数据——图像、音乐、程序等,都只是数字。一个简单的字符也不例外,它也被编码编码为一个数字。

于 2013-06-15T15:09:30.790 回答
2

char在 Java 中存储为 2 字节的 unicode 值。因此,如果char x = 'A',则表示A以 unicode 格式存储。在 unicode 格式中,每个字符都表示为一个整数。因此,当您说时x= x+1,它实际上增加了A打印的 unicode 值B

于 2013-06-15T15:14:00.967 回答
0

因为 char 类型实际上像 16 位 unsigned int 一样工作。

所以设置char x='A'几乎等同于int x=65 当你加一个;你得到66;或 ASCII 'B'。

于 2013-06-15T15:08:54.170 回答
0

每个char都有一个字符代码。计算机将字符视为无符号数字,因此您可以递增它。

于 2013-06-15T15:09:05.347 回答
0

如果您希望它只是 az。

private char getNextChar(char c) {
    return (char)((c + 1 - 'a') % ('z' - 'a' + 1) + 'a');
}

这避免了它溢出。

于 2020-02-26T03:43:18.483 回答