Почему можно объявить переменную без начального значения?

Я читаю принципы программирования Languanges:

Он говорит, что также можно объявить переменную, не давая ей начального значения, а также что мы должны быть осторожны, чтобы не использовать переменную, которая была объявлена без начального значения и которой не было присвоено значение. Это приводит к ошибке.

Примечание: автор книги упоминает о возможности объявления переменных без начального значения на Java.

Итак, почему это объявление переменных действует? Когда я собираюсь его использовать?

7 ответов


есть много разных причин для многих разных языков.


Когда вы объявляете переменную,вы хотите, чтобы некоторая память удерживала переменную. Это включает в себя запрос ядра операционной системы для памяти или какой-то программы мониторинга, которая отслеживает память. Короче говоря, это может быть дорогостоящая операция.Следовательно, во многих случаях желательно выделить всю необходимую для объекта память одновременно, а затем назначить какое бы значение ему ни было присвоено позже. Таким образом, вы можете увеличить производительность программы в критической части. Этот вариант использования достаточно распространен, чтобы разрешить объявление функции без инициализации. Однако во всех остальных случаях рекомендуется инициализировать переменную при назначении.

подумайте о распределении памяти как бюрократии. Слишком много бумажной работы. Итак, если вы знаете, что собираетесь использовать большой объем памяти позже вы просите большой объем памяти заранее в одной транзакции, а не спрашиваете ядро каждый следующий раз.

ДОРОГАЯ ИНИЦИАЛИЗАЦИЯ
Этот пункт очень похож на вышеупомянутый. Предположим, у вас есть массив 1 миллион раз 1 миллион. Инициализация такого массива-дорогостоящая процедура. Делать это со значениями по умолчанию было бы глупостью, а значит, такой функцией, где выделяется память, а затем используется по мере необходимости.

здесь, его как вы покупаете огромное количество блоков lego, чтобы построить что-то, но вы хотите купить их в форме Человека-паука по умолчанию. Владелец магазина или вам придется очень трудно получить их в форме Человека-паука, когда вы в любом случае собираетесь изменить их позже.


например, у вас может быть что-то вроде этого:

int i;
if (first_condition)
    i = 1;
elseif (second_condition)
    i = 2;
else
    i = 0;

ваша переменная должна быть объявлена вне if для его использования позже, но его значение фиксируется внутри if условиях.


Если вы действительно посмотрите, что происходит, когда вы объявляете переменную и инициализируете ее (назначаете начальное значение), вы увидите, что на уровне машинной инструкции или байтового кода для Java в обоих этих шагах используется значительное количество вычислительной мощности.

  1. объявление переменной означает выделение памяти, создание экземпляра запрашиваемого типа и т. д.
  2. затем инициализация этого местоположения памяти снова требует дополнительной обработки для перемещения значение по умолчанию для выделенного места памяти, например, заполнение его 0s, если значение по умолчанию равно 0. (Примечание: когда случайное расположение памяти выделяется переменной, что память может содержать любой шаблон, оставленный там предыдущим значением)

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

Итак, если язык заставляет вас инициализировать переменную (или делает это сам по себе) при объявлении, то это уменьшает шансы на ошибку вниз по линии, но это может быть тратить вычислительную мощность на то, что вы действительно не хотели.

с другой стороны, если он позволяет объявлять переменную без ее инициализации, это дает вам контроль и может сэкономить некоторую вычислительную мощность для вас, но открыть шансы на ошибку. (Предположим, у вас есть сценарий, где ваше начальное значение для varible зависит от некоторых других условий, которые будут рассмотрим и назначим переменную соответственно. В таком случае инициализация VAR при объявлении может быть просто пустой мощностью обработки).

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

Если речь идет о том, чтобы дать программисту возможность контролировать и делать высоко оптимизированные программы, то они обычно позволяют объявлять vars без инициализации, в дополнение к большему количеству вещей.

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


Если Java потребует, чтобы поля объекта класса всегда записывались до того, как они были прочитаны, это потребует либо

  • конструктор объекта класса должен писать во все поля этого объекта, включая те, которые код никогда не будет читать, не написав их во второй раз позже; это было бы уродливо и неэффективно.

  • каждое поле должно содержать never been written значение, которое отличается от любое другое значение, которое может быть записано на него.

  • компилятору придется решить проблему остановки, чтобы определить, может ли поле быть прочитано без записи.

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

из этих возможных вариантов, #4 является наименьшим злом. Чтобы избежать неопределенного поведения, Java определяет поведение чтения поля, которое никогда не был написан: он будет содержать значение по умолчанию для своего типа.


вы можете объявить пустой var, например, в сценарии проверки,

$error='';
if(empty($_POST['first_name']{
$error=$error."You did not enter a name";

}

как это, но я бы использовал его только в том случае, если код сразу после него повторно объявил его, как указано выше, чтобы он не "потерялся".


Ok вот пример. В настоящее время я устанавливаю глобальные значения, которые установлены на постоянные на форумах PDF. Для этого приложения я хочу использовать эти значения в качестве хранилища данных как текстовое поле. Не лучший метод, но он работает для этого примера. Вместо того, чтобы заполнять мой форум сотнями скрытых текстовых полей, я могу установить значения как постоянные глобальные переменные.

Если мое начальное замедление установлено в 0 или "" как значение переменная than не будет хранить данные между сеансами. При инициализации форума значение будет сброшено до нуля. Как и в случае со скриптами, форумы действовали по порядку. Сначала он распознает все сценарии в документе, прежде чем назначать значения для переноса переменных. Таким образом, необходимо объявить переменную без значения, чтобы инициализация не заменяла значения.

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

дополнительно

эффективно назначать значение при объявлении, но не общие значения держателя места. В большинстве скриптов int не так просто, как сказать int x = 5; чаще мы вызываем такие данные, как этого.getField ("TextBox3").значение; или какой-то другой код строки. Назначая универсальное значение, такое как "" или 0 или правда ваша функция может работать, даже если вы не смогли правильно использовать это значение. Не присваивая значения, если вы не используете переменную, ваша функция не позволит вам сузить возможности при решении проблем. Если int x; еще Нэн когда вы используете x чем ваш сбор данных и проверки, вероятно, являются источником проблемы.

В общем объявите все значения вверху и избегайте установки общих значений, если вам не нужно. Если вы собираетесь определить значения x позже, чем не задать его int x = 0;.


что-то типа:

//declare without giving value.
int i;

//set value
i=9;