首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我不能写ch=ch+1;而不是ch++;尽管它们的含义相同

为什么我不能写ch=ch+1;而不是ch++;尽管它们的含义相同
EN

Stack Overflow用户
提问于 2018-12-15 09:57:26
回答 3查看 967关注 0票数 7
代码语言:javascript
复制
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++;时会出错呢?

EN

回答 3

Stack Overflow用户

发布于 2018-12-15 09:59:51

为了做到这一点,您需要提供一个演员阵容:

代码语言:javascript
复制
ch = (char) (ch + 1);

这是因为将表达式ch + 1提升为int。为了将该表达式重新分配给char,您需要显式地将其向下转换。

票数 6
EN

Stack Overflow用户

发布于 2018-12-15 10:00:14

通过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.类型。

票数 5
EN

Stack Overflow用户

发布于 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,注意可能会丢失精度。因此,如果没有显式强制转换,编译器就会抱怨这一点,这是错误的原因。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53791297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档