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

时间:2018-12-15 09:57:27

标签: java char integer increment

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++;时却出错了?

3 个答案:

答案 0 :(得分:6)

您需要提供演员表才能做到这一点:

<?php
$orderby=$_REQUEST['orderby'];
if(strpos($orderby,'d')===true){
    echo "exists";
}else{
    echo "not ";
}?>

这是因为表达式ch = (char) (ch + 1); 被提升( upcast )为ch + 1。为了让您将该表达式重新分配给int,您需要明确地 downcast

答案 1 :(得分:5)

通过ch+1char ch将首先升级为int,就像((int)ch) + 1一样,因此结果将是int

当您尝试将int(32位)分配回char(16位)时,它可能会失去准确性,您需要明确进行ch = (char)(ch + 1);


这称为Binary Numeric Promotion

  

二进制数值提升是对某些操作数执行的   运算符:

     

...

     

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

它将执行

  

使用野生原始转换(第5.1.2节)来转换或   以下规则指定的两个操作数:

     

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

     

否则,如果其中一个操作数为float类型,则另一个将被转换   漂浮。

     

否则,如果其中一个操作数的类型为long,则另一个将被转换   长。

     

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

答案 2 :(得分:3)

首先,请注意char的大小为2个字节(16位),而int的大小为32位。

1。键入ch++时:

要应用++运算符,没有类型转换,但该运算符只是使该char的位表示自身加1。请参阅 JLS11第15.14.2章,第575页:

  

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

2。键入ch=ch+1时:

ch首先转换为int,然后由1添加(仍然是一个int),而=实际上正在转换为{{1 }}具有32位,而int仅具有char位,请注意,这可能会失去准确性。因此,如果没有显式强制转换,编译器将对此抱怨,这就是错误的原因。