Пожалуйста, рассмотрите этот фрагмент кода Java. Это работает, но я пытаюсь понять, что он делает.
char str = 'foo'
long prime = 503;
long hash = 0;
hash = prime + str.charAt(1);
Я запутался, потому что это математическое сложение разных типов данных. Был бы я прав, если бы думал, что символ был преобразован в его значение ASCII для целей этой математической операции?
Спасибо!
Возможный дубликат Объединить целое число в строку - использовать строковый литерал или примитив с точки зрения производительности и памяти?
Этот код не компилируется. str должен быть строкой, а не char
Ваша первая строчка char str = 'foo'; не имеет смысла. Может вы имеете в виду String str = "foo";
@DyZ Это не дубликат этого вопроса: здесь нет конкатенации строк




Во-первых, у вас неправильный синтаксис. Я исправил это (см. Код ниже). Теперь значение hash будет 614. Поскольку hash = prime + str.charAt(1) означает, что вы добавляете значение ASCII символа в индекс 1 строки str, то есть 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 и запустить код, чтобы увидеть результат.
РЕДАКТИРОВАТЬ
Как отметил @Henry, значение символа не ограничивается только значением ASCII в Java. Поэтому лучше использовать здесь термин кодовая точка Unicode вместо значения ASCII. Для получения более подробной информации, пожалуйста, обратитесь к В чем разница между ASCII и Unicode?
строго говоря, это не значение ASCII, а кодовая точка Unicode символа (пока она находится в BMP). Оба согласны в диапазоне ASCII, но в Java можно использовать гораздо больше символов.
Фактически, это кодовая единица UTF-16, одна или две из которых образуют кодовую точку Unicode. Попробуйте String foo = "?";.
Да. Согласно Спецификация языка Java, §5.6.2,, когда вы применяете операцию сложения + к long и char, «расширяющее примитивное преобразование» будет выполнено на char, и сложение будет выполнено с двумя значениями long.
Можно сказать несколько иначе: char и long на самом деле не являются разными типами. Оба они целые. Точно так же, как вы можете сложить int и byte вместе (и байт расширяется до int), и вы можете добавить int и long (int расширяется до long), чтобы вы могли добавлять char к другим типам целых чисел. (И целые числа могут быть преобразованы в числа с плавающей запятой, поэтому вы также можете добавлять их в char и другие целые числа.)
Я буду гудеть здесь и добавлю ссылку на другой вопрос, на который я ответил, который включает арифметику для типов char: stackoverflow.com/questions/33770180/…
Would I be correct if I thought the character was converted to its ASCII value for the purposes of this math operation?
Да (за исключением того, что вам нужно изменить вашу первую строку на String str = "foo";. В основном char - это целочисленный тип, который можно использовать в арифметических выражениях.
Javadoc говорит:
charAt
public char charAt(int index)Returns the char value at the specified index.
JLS (спецификация языка Java) говорит:
Chapter 4. Types, Values, and Variables
The numeric types are the integral types
byte,short,int,long, andchar
а также
4.2. Primitive Types and Values:
char, whose values are 16-bit unsigned integers representing UTF-16 code units (§3.1)"
а также
4.2.1. Integral Types and Values
For char, from
'\u0000'to'\uffff'inclusive, that is, from0to65535
а также
5.6.2. Binary Numeric Promotion
When an operator applies binary numeric promotion to a pair of operands, each of which must denote a value that is convertible to a numeric type, the following rules apply, in order:
...
Widening primitive conversion (§5.1.2) is applied to convert either or both operands as specified by the following rules:
...if either operand is of type long, the other is converted to long.
а также
15.18.2. Additive Operators (+ and -) for Numeric Types
The binary + operator performs addition when applied to two operands of numeric type, producing the sum of the operands.
Binary numeric promotion is performed on the operands (§5.6.2).
Вам не хватает очень важного 4.2. Примитивные типы и значения: «char, значения которого представляют собой 16-битовые целые числа без знака, представляющие единицы кода UTF-16 (§3.1)», чтобы правильно ответить на вопрос о "значении ASCII".
@andreas, который был неявным из 4.2.1, но хорошо, я добавил его, спасибо
«Был бы я прав, если бы думал, что символ был преобразован в его значение ASCII для целей этой математической операции?» char - это числовой тип данных, преобразование отсутствует.