Почему я не могу написать ch = ch + 1;вместо ch ++;хотя они имеют одинаковое значение - PullRequest
0 голосов
/ 15 декабря 2018
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 голосов
/ 15 декабря 2018

По ch+1, char ch будет повышен до int, как и ((int)ch) + 1, поэтому результатом будет int.

Когда вы попытаетесь назначить int (32 бита) обратно в char (16 бит), это может привести к потере точности, вам нужно сделать это явно ch = (char)(ch + 1);


Это называется Двоичное числовое продвижение :

Двоичное числовое продвижение выполняется над операндами некоторых операторов:

...

Операторы сложения и вычитания для числовых типов + и - (§15.18.2)

и он будет выполнять

Расширяющее примитивное преобразование (§5.1.2) применяется для преобразования одного или обоих операндов, как указано в следующих правилах:

Если один из операндов имеет тип double, другой преобразуется в двойной.

В противном случае, если один из операндов имеет тип float, другой преобразуется в float.

В противном случае, если один из операндов имеет тип long, другой преобразуется в long.

В противном случае обаоперанды преобразуются в тип int.

0 голосов
/ 15 декабря 2018

Прежде всего, обратите внимание, что char имеет размер 2 байта (16 бит), а int - 32 бита.

1.При наборе ch++:

для применения оператора ++ приведение типов отсутствует, но оператор просто заставляет представление бита этого char увеличиваться на 1 для себя.См. JLS11, глава 15.14.2, стр. 575:

Тип выражения приращения постфикса - это тип переменной.

2.При наборе ch=ch+1:

ch сначала приводится к int, затем добавляется 1 (все еще целое число), и = фактически приводит к приведениюint, который имеет 32 бита в char, который имеет только 16 бит, обратите внимание, что это может потерять точность .Поэтому без явного приведения компилятор будет жаловаться на это, что является причиной ошибки.

0 голосов
/ 15 декабря 2018

Вам необходимо предоставить приведение, чтобы сделать это:

ch = (char) (ch + 1);

Это потому, что выражение ch + 1 is преобразуется ( upcast ) в int.Чтобы переназначить это выражение на char, вам необходимо явно downcast it.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...