为什么我不能写ch=ch+1;替代ch++;尽管它们有相同的意思

7
package practicejava;

public class Query {

    public static void main(String[] args) {
        char ch = 66;
        System.out.println("character= " + ch);

        ch++;

        System.out.println("character = " + ch);

    }
}

技术上来说,ch++;ch=ch+1; 是一样的,但是为什么我写 ch=ch+1; 时会出现错误而写 ch++; 不会呢?

欢迎来到Stack Overflow!请随意浏览,并阅读[帮助中心],尤其是如何提出好问题的部分。在提问时,请始终引用确切的错误信息,而不仅仅说您收到了一个错误。在这种情况下,我们可能可以猜到您所说的错误,但您不希望让试图帮助您的人猜测。 - T.J. Crowder
这是一个混淆的行为,它已经被C++及其前身所采用。 - Ole V.V.
3
一个 int 加上一个 char 得到的是一个 int - Peter Lawrey
请注意,Java是为数不多的几种语言之一,它实际上保留了与C不同的字符类型,在大多数语言中,字符实际上是字符串,如果您尝试将它们视为整数进行处理,则无法编译(或会抛出运行时错误)。 - Jared Smith
3个回答

6
您需要提供一个类型转换才能这样做:
ch = (char) (ch + 1);

这是因为表达式ch + 1被提升(upcast)为一个int。如果你想将这个表达式重新分配给一个char,你需要明确进行downcast

5
通过ch+1char ch将首先提升为int,就像((int)ch)+1一样,因此结果将是一个int
当您尝试将int(32位)赋回给char(16位)时,可能会丢失精度,您需要明确地执行ch = (char)(ch + 1);

这被称为二进制数值提升

二进制数值提升应用于某些运算符的操作数:

...

数字类型的加法和减法运算符+和-(§15.18.2)

并且将执行

扩展原始转换(§5.1.2)应用于根据以下规则指定的一个或两个操作数进行转换:

如果任一操作数是double类型,则另一个操作数将转换为double。

否则,如果任一操作数是float类型,则另一个操作数将转换为float。

否则,如果任一操作数是long类型,则另一个操作数将转换为long。

否则,两个操作数都将转换为int类型。


3
首先,需要注意的是char占用2个字节(16位),而int则为32位。 1. 当输入ch++时: 应用++运算符时,没有类型转换,该运算符只会将该char的位表示自增1。请参阅JLS11第15.14.2章第575页:

后缀递增表达式的类型是变量的类型。

2. 当输入ch=ch+1时: 首先将ch转换为int,然后加上1(仍为int),并且=实际上尝试将具有32位的int转换为只有16位的char,请注意这可能导致精度损失。因此,如果没有显式强制转换,编译器会报告错误。

我不理解第一点。如果在ch++操作后将ch转换为int并打印ch的值,为什么它显示字符而不是整数?您能否详细解释第一个术语? - Tushar Mia
1
抱歉我的英语不好,我的意思是:假设我最初将'A'赋值给ch。然后我执行ch ++;操作。在这里,如果将ch转换为int,然后添加值1。这里对应的Unicode值为65,然后加1。总共66,因此当我执行System.out.print(“character”+ ch)操作时,它应该显示输出如下:character 66。这是我从您的第二条评论中理解的全部内容。然后我问你,如果ch被转换为int,然后添加int值1,为什么输出是字符B。 - Tushar Mia
“the bit represent of that char” 是什么意思? - Tushar Mia
我的意思是该字符的值,而该值由一组位(16位)存储在内存中。 - ZhaoGang

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