Неочевидная индексация массива - PullRequest
3 голосов
/ 17 ноября 2011

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

String usedAlphabet = "x3w4tnu34urgbgierg";

byte c = // (something initialized earlier)

return usedAlphabet[(int)(c / 16)];

Теперь, что может быть причиной использования приведения (int) при доступе кмассив?

Мне кажется, что это излишне, но я могу ошибаться или у меня может не быть знаний о механике литья типов.

Ответы [ 5 ]

6 голосов
/ 17 ноября 2011

Вы правы; это избыточно здесь. Иногда избыточное приведение может сделать использование более очевидным для читателя , но это будет зависеть от контекста.

5 голосов
/ 17 ноября 2011

Вы правы - деление является целочисленным делением, которое всегда приводит к целому числу, поэтому приведение не требуется.

Однако у c сам по себе отсутствует контекст (особенно, если он не был определен близкодля этого использования), так как может быть не очевидно, что это byte / int.Вполне возможно, что приведение было добавлено для удобства чтения.

2 голосов
/ 17 ноября 2011

Поскольку c представляет собой byte, а 16 представляет собой int, результатом деления является int, что делает приведение лишним.Однако возможно, что в какой-то момент объявление c было что-то вроде long или double, и приведение было необходимо.Когда объявление было изменено, актерский состав никогда не удалялся.

1 голос
/ 18 ноября 2011

Как вы уже узнали, состав избыточен .Это помогает в удобочитаемости?Возможно, в зависимости от контекста.Что можно сделать, чтобы действительно способствовало удобочитаемости этой "неочевидной индексации массива"?Хорошие имена, которые я вам говорю (конечно, автор должен найти правильные имена, которые сообщают о его намерениях, я только что их здесь придумал):

int sectionSize = 16;

String usedAlphabet = "x3w4tnu34urgbgierg";
byte sectionIndex = // (something initialized earlier)

int alphabetIndex = sectionIndex / sectionSize;
return usedAlphabet[alphabetIndex]; // not so puzzling anymore
1 голос
/ 17 ноября 2011

Я полагаю, что от разработчиков, которые не имеют четкого представления о правилах набора текста для языка и поэтому применяют подход «лучше, чем безопасно, чем сожалеть». Я подозреваю, что большинство из нас сделали это в определенный момент. Это сказанное - бросок ненужен и даже не разъясняющий.

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