Java中的Char类型自增

36

在练习 Java 时,我偶然想出了这个:

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

我本以为程序会抛出错误,因为在数学中我们不能将数字值1与字母A相加,但是下面的程序能够正确运行并打印输出:

我认为这个程序会报错,因为在数学中我们不能将数字值1与字母A相加,但是这个程序能够正常运行并输出结果:

B 

怎么可能呢?


1
x 是一个字符,Unicode 值为 'B' 的 Unicode 值等于 'A' 的 Unicode 值加 1。 - Grijesh Chauhan
1
你正在将int添加到char的ASCII代码中,而不是char本身。 - Maroun
7
我希望在Java上下文中可以摆脱“ASCII”这个词。Java自1995年问世以来一直在使用Unicode编码。 #不爽的早晨 - Ray Toal
1
试试这个 x *= 1.1;,它也可以编译通过。;) - Peter Lawrey
2
引用的程序无法编译。它有两个错误,一个是缺少“;”,另一个是需要将增量的结果强制转换回char类型。 - Patricia Shanahan
1
这段代码会报告“可能会丢失精度”的错误。 - Devavrata
11个回答

54
在Java中,char是一种数值类型。当你将1添加到char时,你会得到下一个unicode code point 。对于'A',下一个代码点是'B'
char x='A';
x+=1;
System.out.println(x);

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


感谢提到隐式缩小转换。 - Ankit Garg

5
这是您程序的等效程序:
public class Tester {
    public static void main(String args[]){
             char start='\u0041';
             char next='\u0041'+1;
             System.out.println(next);
    }
}

然而,如你所见,next=start+1 是无法正常工作的。这是Java的处理方式。

原因可能是我们可能会不小心使用整数1来认为start是一个int变量,并使用该表达式。由于Java非常严格地减少逻辑错误,他们是这样设计的。

但是,当你执行char next='\u0041'+1;时,很明显'\u0041'是一个字符,1将隐式转换为2字节。程序员不会犯这个错误。也许这就是他们允许的原因。

char在Java中占用2个字节,支持unicode字符。当您将char变量与偏移整数相加或相减时,Unicode表中相应的unicode字符将产生结果。由于B紧挨着A,所以你得到了B


5

char实际上映射到一个int,请查看ASCII表

例如:大写字母A对应十进制数65。当你给该char加1时,你就是将该十进制数增加1。因此,数字变成66,对应于大写字母B。


感谢提供的链接,现在我明白了Java将char视为数字。 - Mahesh Nadar

4

在使用括号进行加法运算后,您需要进行类型转换,如下所示:

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

否则你将会遇到数据丢失错误。


4

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

您还可以执行以下操作:

int foo = 'A';

这里特别的是你使用了字符常量而不是数字来初始化char。它的字符串表现形式也很特别,正如你所见。你可以使用Character.digit(c, 10)来获取它的数值(作为一个int,因为2 ^ 16 - 1不能被表示为一个short!)。


2
在Java中,char只是一个整数,因此增加/减少它是可以的。每个字符数字都有一个相应的值,即通过转换表对其进行字符解释,无论是ASCII编码还是UTF-8编码等。
想一想,在计算机中的所有数据 - 图像、音乐、程序等都只是数字。一个简单的字符也不例外,它也被编码或编成一个数字。

2

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


0

因为类型char实际上就像一个16位的无符号整数。

所以设置char x='A'几乎等同于int x=65。当你加1时,你得到66;或ASCII码的'B'。


3
什么?!?不是一个字节。请查看Java定义。 - Ray Toal
2
它不像16位整数那样工作。char是无符号的,而short则不是。 - fge
感谢您的意见,有助于改进答案。 - tbsalling
@fge +1。对于任何感兴趣的人:http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.1 - Ray Toal

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

0
在一些语言(如Java)中,字符根据它们的ASCII值被转换为整数。因此可以执行这样的操作。
char inp ='A';
inp +=1;
System.out.println(inp); //Output = B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接