Что делает эта строка кода Java? - PullRequest
0 голосов
/ 23 мая 2018

Пожалуйста, рассмотрите этот бит кода Java.Это работает, но я пытаюсь понять, что это делает.

char str   = 'foo'
long prime = 503;
long hash  = 0;
hash = prime + str.charAt(1);

Я запутался, потому что это математическое сложение разных типов данных.Я был бы прав, если бы думал, что символ был преобразован в его значение ASCII для целей этой математической операции?

Спасибо!

Ответы [ 3 ]

0 голосов
/ 23 мая 2018

Да.В соответствии с Спецификацией языка Java, §5.6.2, , когда вы применяете операцию сложения + к long и char, на * 1006 будет выполнено «расширяющее примитивное преобразование».*, и сложение будет выполняться с двумя значениями long.

0 голосов
/ 23 мая 2018

Я был бы прав, если бы думал, что символ был преобразован в его значение ASCII для целей этой математической операции?

Да (за исключением того, что вам нужно изменить первую строку на String str = "foo";. В основном char является целочисленным типом, который может использоваться в арифметических выражениях.

Javadoc говорит:

charAt

public char charAt(int index)

Возвращает значение символа по указанному индексу.

JLS (спецификация языка Java) говорит:

Глава 4.Типы, значения и переменные

Числовые типы - это целочисленные типы byte, short, int, long и char

и

4.2 Типы и значения примитивов:

char, значения которых представляют собой 16-разрядные целые числа без знака, представляющие кодовые единицы UTF-16 (§3.1) "

и

4.2.1. Интегральные типы и значения

Для символа от '\u0000' до'\uffff' включительно, то естьот 0 до 65535

и

5.6.2.Двоичное числовое продвижение

Когда оператор применяет двоичное числовое продвижение к паре операндов, каждый из которых должен обозначать значение, которое может быть преобразовано в числовой тип, применяются следующие правила:

...

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

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

и

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

Бинарный оператор + выполняет сложение при применении к двум операндам числового типа, получая сумму операндов.

Двоичное числовое продвижениевыполняется над операндами (§5.6.2).

0 голосов
/ 23 мая 2018

Во-первых, ваш синтаксис неправильный.Я исправил это (см. Код ниже).Теперь значение hash будет равно 614. Поскольку hash = prime + str.charAt(1) означает, что вы добавляете значение ASCII символа в индекс 1 строки, то есть o.Значение ASCII o равно 111.Таким образом, значение hash равно 614 после добавления.

String str   = "foo";
long prime = 503;
long hash  = 0;
hash = prime + str.charAt(1);
System.out.println(hash); // This line prints 614. Because value prime is 503 and the ASCII value of `o` is 111.

Вы можете поиграть с этим Ideone https://ideone.com/EcbP8x и запустить код, чтобы увидеть вывод.

EDIT

Как указал @Henry, значение символа не ограничивается только значением ASCII в Java.Таким образом, лучший термин для использования здесь - это кодовая точка Unicode вместо значения ASCII.Для получения более подробной информации, пожалуйста, обратитесь к В чем разница между ASCII и Unicode?

...