关于字符变量的增量

问题描述 投票:4回答:4

下面的代码不起作用,编译器说'从int到char可能的有损转换'

public class Main
{
    public static void main(String[] args) {
        char ch;
        ch = 65;
        ch=ch+1;
        System.out.println(ch);
    }
}

然后为什么下面的代码可以正常工作:

public class Main
{
    public static void main(String[] args) {
        char ch;
        ch = 65;
        ch+=1;
        System.out.println(ch);
    }
}

虽然两个代码的唯一区别只是'ch = ch + 1''ch + = 1'?

java error-handling char increment auto-increment
4个回答
3
投票

在Java中,char变量的大小为:2个字节,一个int变量的大小为:4个字节。

N.B:一个字节由8位组成,可以保存一个最大为256的数字。

在第一个代码段中,当您执行(ch +1)时,编译器认为默认情况下1是一个int值,因此也将最终值也视为int。然后,编译器尝试将最终值放入ch中,这是一个字符... ops ..它试图将4字节表示的值拟合到大小为2字节的变量中!

如果您这样做,可以解决此问题:频道=(字符)(频道+1)

在第二个代码段中,无论变量ch的大小如何,都直接对其进行递增。因此,您不会遇到试图将int值拟合到char变量中的问题。


2
投票

由于+=的结果已转换为左侧变量的类型,因此您的操作ch+=1;将按以下方式工作:

ch += 1;
^     ^ ------- right hand (int)
+-------------- left hand  (char)

将使用例如((int) ch)将ch转换为int:

然后将((int) ch)1相加并将其强制转换为char以返回原始类型,所有这些都可以作为:

ch = (char) ((int) ch + 1);

0
投票

如果ch + = 1,则>

内部类型转换将由编译器自动执行

如果是ch = ch + 1

开发人员必须显式地进行类型转换,否则我们将编译时间错误

CE:可能失去进动发现:int必填:char

规则:-如果我们应用任何算术运算符b / w 2个操作数'a'和'b',则结果类型为max(int,a的类型,b的类型)


0
投票

在Java中,ch = ch + 1是隐式变窄转换的一种形式。这就是为什么编译器会引发可能的有损转换。您可以在Google上找到更多有关此的信息>


0
投票

[ch+=1等于ch=ch+(char)1而不是ch=ch+1


0
投票

在Java中,char变量的大小为:2个字节,一个int变量的大小为:4个字节。

© www.soinside.com 2019 - 2024. All rights reserved.