Котировки
С Java я читаю книгу, чтобы перекрыть основы, которые я забыл в колледже, и они показывают мне инструкцию swtich:
void helpon(int what) {
switch(what) {
case '1': break;
case '2': break;
}
}
Я пропустил код кода, потому что неактуальен.
Однако мне показалось странным использовать int
и по-прежнему обертывать операторы case в одинарных кавычках, поэтому я перешел к oracle docs и нашел пример, аналогичный приведенному выше примеру, но без кавычек.
У кавычек вопрос для оператора switch, который использует целые числа в качестве примера? Почему '1'
работает, если what
является int
и '1'
является char?
Ответы
Ответ 1
Одиночные кавычки являются буквальными char
и char
значениями в значениях int
. A char
может быть представлен как int
из его значения UTF-16, например:
char c = '1';
int i = c;
System.out.println(i);
Вывод:
49
Дополнительная информация:
Не путайте символы ASCII (один байт, значение от 0 до 127) и UTF-16 (2 байта на кодовую точку, значение от 0 до 65535). Дополнительная информация: Unicode, UTF, ASCII, различия в формате ANSI
Ответ 2
Я просто хочу добавить некоторую глубину. Да '1' - это char of 1, который хранится как int valu e, поэтому вы можете использовать int в char (одиночные кавычки - это другой способ сделать это). Однако char хранится как диапазон с максимальным 65535 (Java - utf-16, я считаю так 2 ^ 16). Вы не можете иметь отрицательное значение int в char без кастинга и литья, что даст нечетный символ. Значение, большее, чем диапазон, является проблемой.
Переключатель примет следующий int, char, short, byte (все, что подходит в int), и с SE7 a String. В принципе, примитивы и объект String приемлемы. Вы можете превратить примитив в объект, такой как Integer, Character, Short, Byte.
Технически с char вы можете использовать либо int внутри диапазона, либо char для случая, если вы проверяете правильную вещь.
С int следует использовать все, что автоматически вписывается в int. Литье в параметре переключателя приводит к потере точности.
Для хорошей меры, не забудьте сломать или провалиться. Кроме того, операторы case должны быть константами, определяемыми во время компиляции, либо арифметикой известных и приемлемых примитивов, известного примитива с использованием окончательного модификатора, либо константы с прямой кодировкой.
Ответ 3
Символы "1" и "2" в этой помощи интерпретируются как их значение UTF-16. Итак, "1" действительно оценивается как 49, "2", как 50, и так далее.
Мне нужно больше rep для публикации фотографий, но здесь ASCII-код. http://asciiset.com/asciitable.gif.
Ответ 4
char
будет преобразован в UTF-16, а затем он будет сравниваться. Также после Java7 вы также можете записать String в случаях переключения.