установка размера как n в для цикла - PullRequest
0 голосов
/ 23 мая 2018

Я изучал курсы программирования C в университете около 4 месяцев.

В C это своего рода «правило» всегда устанавливать размер (длину) чего-либо равного n в цикле for.Я покажу в примере ниже.

for(int i = 0, n = strlen(x); i < n; i++) {

В Java, однако, я никогда не вижу, чтобы кто-то устанавливал длину / размер массива / последовательности символов / и т.д.равный n и ТО, имеющий условие.Мы всегда получали бы 1 очко меньше или что-то в этом роде, если бы мы постоянно не делали таких вещей.Это лучше, потому что компьютер не должен искать длину снова и снова (каждый раз, когда он повторяется).

Почему люди не используют это в Java?Есть ли причина для этого?Разве это не имеет значения, чтобы сделать это?

Редактировать: Я видел, что так мало людей делают это в C .. В любом случае, я так учился, и я последовательно делаю это и в Java.

Ответы [ 3 ]

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

Это пример оптимизации кода.Компиляторы языков более высокого уровня автоматически добавят эту оптимизацию и другие подобные.Я недостаточно знаком с компиляцией C, чтобы сказать, добавляют ли они эту оптимизацию автоматически.Я рекомендую изучить конкретный компилятор, который вы использовали, чтобы выяснить, так ли это.

Было бы любезно, если бы ваш профессор отметил, почему этот подход был так важен для него.Я могу вам сказать, что он не является идиоматическим для языков, таких как Java, и делает ваш код менее читабельным, поэтому я рекомендую против этой практики, если вы не сможете продемонстрировать явное преимущество.Он, вероятно, пытался научить вас делать это по умолчанию, потому что некоторые языки более низкого уровня не будут обрабатывать это автоматически, и получение подсчета может быть дорогостоящим, если вы скажете, что по какой-то причине вам нужно получить подсчет из API или базы данных.

Редактировать: Компас в комментариях делает отличную точку.Если у вас есть привычка изменять список, в котором вы находитесь, внутри тела вашего цикла, у вас будет плохое время, если вы не назначите терминатор цикла заранее.Обычно это не очень хорошая идея - изменять размер списка внутри цикла, который все равно зависит от этого списка.

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

Массив имеет свойство длины, сохраненное как public final field, как указано в 10.7. Элемент массива

public final field length, который содержит количество компонентов массива.длина может быть положительной или нулевой.

Обычный доступ к полю объекта осуществляется с помощью инструкции getfield, но для получения длины массива Java предоставляет специальную инструкцию arraylength для него:

Все массивы имеют связанные длины, доступ к которым осуществляется с помощью инструкции arraylength.

Таким образом, доступ к array.length является прямым и не отличается от доступа клокальная переменная

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

В Java вы обычно ссылаетесь на какое-то предварительно рассчитанное поле, например arr.length, str.length(), list.size().Преимущества сохранения их в переменной незначительны, и компилятор JIT, вероятно, мог бы сделать это автоматически, если бы это помогло.Но если вы можете продемонстрировать значительное улучшение в каком-то конкретном случае , обязательно продолжайте.

...