вопрос из области информатики старших классов

yemets63
Дата: 04.07.2019 10:43:51
на сколько важно после объявления переменной её инициализировать

первый текст

var 
 i:integer;
begin
//инициализация
 i:=0;
//далее текст
 if a=b then i:=15 else 
 if a=c then i:=25 else
  i:=0;
end;


или без инициализации

var 
 i:integer;
begin
//далее текст
 if a=b then i:=15 else 
 if a=c then i:=25 else
  i:=0;
end;


почему второй текст без инициализации плохой?
softwarer
Дата: 04.07.2019 10:50:52
Я бы сказал, что оба текста одинаково плохи, и оптимизатор просто-напросто уберёт и переменную, и текст, и процедуру в целом. Что же касается варианта с инициализацией, то в современных тенденциях плох как раз он (компилятор напишет хинт о лишнем присваивании), но в старые времена дебилов тренировали писать такие начальные присваивания из-за того, что при последующем сопровождении "текст" может измениться и неинициализированное значение переменной пойдёт дальше, в текст2, текст3 итд.
Gerasimenko
Дата: 04.07.2019 10:54:51
yemets63,

+ в первом способе последний Else лишний. Так что вопрос о том, какой текст лучше: спорный

Для мелких процедур и функций пофиг.
А вот, где много кода, можно что-то упустить, и получить Exception.
Правда, имеет место быть следующее мнение: все что больше 30 строчек кода - это плохо и нужно дробить дальше...
Итого: первый метод лучше второго тем, что приучает всегда обезопасить свой код.
yemets63
Дата: 04.07.2019 13:13:05
Gerasimenko
первый метод лучше второго тем, что приучает всегда обезопасить свой код.

согласен.

суть не про текст далее после инициализации и лишнего else, всё чуть сложнее, просто спор иногда случается среди разных поколений, мнение ваше интересно
Cobalt747
Дата: 04.07.2019 13:15:01
yemets63,

Инициализировать переменные на стеке нужно в тех случаях, когда переменная не является управляемой компилятором.
например, строки, динамические массивы - их не надо инициализировать - это уже сделал компилятор за вас, вставив нужный код в начало процедуры.
А вот всякие там числа - надо.
Соколинский Борис
Дата: 04.07.2019 14:02:04
Cobalt747
Инициализировать переменные на стеке нужно в тех случаях, когда переменная не является управляемой компилятором.
например, строки, динамические массивы - их не надо инициализировать - это уже сделал компилятор за вас, вставив нужный код в начало процедуры.
А вот всякие там числа - надо.

Тут играем, тут не играем, тут рыбу заворачивали ... (с)

Давно пора бы уже было вставить в компилятор инициализацию всего, как полей объектов или глобальных переменных.
Какая-то детская экономия на производительности.
DarkMaster
Дата: 04.07.2019 14:03:03
Cobalt747,

В данном конкретном случае - пофиг, инициирована переменная или нет - с тем, чему она там равна никаких операций не выполняется и от ее изначального значения ничего не зависит.
rgreat
Дата: 04.07.2019 14:03:18
Соколинский Борис
Тут играем, тут не играем, тут рыбу заворачивали ... (с)

Давно пора бы уже было вставить в компилятор инициализацию всего, как полей объектов или глобальных переменных.
Какая-то детская экономия на производительности.
Сделай запрос на quality.
_Vasilisk_
Дата: 04.07.2019 14:08:53
yemets63
мнение ваше интересно
Я не инициализирую. А присваиваю значение в том месте, где это нужно.

Исключение, когда одно значение присваивается несколько раз
if a = b then begin
  if p = q then
    i := 1
  else
    i := 0;
end else if a > b then begin
  if x = y then
    i := 2
  else
    i := 0;
end else
  i := 0;
такой код я пишу так
i := 0;
if a = b then begin
  if p = q then
    i := 1;
end else if a > b then begin
  if x = y then
    i := 2
end;
ну и всегда смотрю на предупреждения компилятора
KreatorXXI
Дата: 04.07.2019 14:32:01
А можно для тех, кто в танке. В Дельфях, если явно не присваивать переменную нулю, чему она будет равна?