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++;时会出错呢?
发布于 2018-12-15 09:59:51
为了做到这一点,您需要提供一个演员阵容:
ch = (char) (ch + 1);这是因为将表达式ch + 1提升为int。为了将该表达式重新分配给char,您需要显式地将其向下转换。
发布于 2018-12-15 10:00:14
通过ch+1,char 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.类型。
发布于 2018-12-15 10:12:27
首先,注意char是2字节大(16位),int是32位。
输入ch++**:**时1.
要应用++运算符,不存在类型强制转换,但运算符只会使表示该char的位本身增加1。参见JLS11第15.14.2章,第575页:
后缀增量表达式的类型是变量的类型。
输入ch=ch+1**:**时2.
ch首先被抛到int中,然后由1(仍然是int)添加,而=实际上是尝试将具有32位的int转换为只有16位的char,注意可能会丢失精度。因此,如果没有显式强制转换,编译器就会抱怨这一点,这是错误的原因。
https://stackoverflow.com/questions/53791297
复制相似问题