«Использование целочисленного операнда со знаком с двоичным побитовым оператором» - при использовании беззнакового короткого

ArrayIndexOutOfBoundsException само имя объясняет, что если вы пытаетесь получить доступ к значению в индексе, который выходит за рамки размера массива, возникает такое исключение.

В вашем случае вы можете просто удалить знак равенства из цикла for.

for(int i = 0; i<name.length; i++)

Лучшим вариантом является итерация массива:

for(String i : name )
      System.out.println(i);
28
задан SakoDaemon 17 May 2018 в 19:21
поделиться

1 ответ

Существует регистрация опрятного лязгом, который называют hicpp-signed-bitwise. Эта проверка следует за формулировкой ИКОТЫ ++ стандарт. Тот стандарт не в свободном доступе, но вот цитата от него :

5.6.1. Не используйте побитовые операторы с операндами со знаком

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

авторы ИКОТЫ ++ кодирование стандарта неправильно истолковало намерение C и стандартов C++ и или случайно или намеренно сфокусировалось на тип операндов вместо значение из операндов.

регистрация опрятных лязгом реализаций точно эта формулировка, для приспосабливания тому стандарту. Та проверка не предназначается, чтобы быть обычно полезной, ее единственная цель состоит в том, чтобы помочь плохим душам, программы которых должны приспособить той глупому правилу от ИКОТЫ ++ стандарт.

критический момент - то, что по определению целочисленные литералы без любого суффикса имеют тип int, и что тип определяется как являющийся типом со знаком. ИКОТА ++ теперь неправильно приходит к заключению, что положительные целочисленные литералы могли бы быть отрицательными, и таким образом мог вызывать неопределенное поведение .

Для сравнения, в стандарте C11 говорится:

6.5.7 Поразрядных операторов сдвига

, Если величина правильного операнда отрицательна или больше, чем или равна ширине продвинутого левого операнда, поведение не определено.

Эта формулировка тщательно выбрана и подчеркивает, что значение из правильного операнда важно, не его тип. Это также покрывает случай слишком большого значения, в то время как ИКОТА ++ стандарт просто забыла тот случай. Поэтому высказывание 1u << 1000u в порядке в ИКОТЕ ++, в то время как 1 << 3 не.

лучшая стратегия состоит в том, чтобы явно отключить эту единственную проверку. Существуют несколько отчетов об ошибках для CLion, упоминая это, и это становится фиксированным там.

2
ответ дан 27 November 2019 в 16:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: