Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.12.2010, 08:09   #1
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
Вопрос Локальные переменные

Почему локальные переменные нельзя объявлять следующим образом?
Код:
var
  i: Integer = 1;
Вот, собственно и весь вопрос.
Sibedir вне форума Ответить с цитированием
Старый 22.12.2010, 08:11   #2
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

А как это отрицательно сказывается на работе кода?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 22.12.2010, 08:45   #3
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

По-моему и так логично. То что предлагаете Вы это шаг в сторону динамической типизации. Нафига писать -
Код:
i: Integer = 1;
когда и так ясно, что I это целое, а не вещественное. А разница между каким-нибудь Byte и Word и так автоматически преобразуется, например, в параметрах процедур и функций...
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 22.12.2010, 09:01   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Почему локальные переменные нельзя объявлять следующим образом?
ну, наверное, потому что для этих целей служат типизированные константы:
Код:
const i : integer = 10;
var s : string;
begin
  s := IntToStr(i);
  i := 33;
  s := s + ' - ' + IntToStr(i);
правда, есть нюансы, это получается не вполне себе локальная переменная, например, объявленную таким образом переменную нельзя использовать как переменную в цикле FOR


p.s. кстати, в языке C# этой проблемы нет! Может стоит потихонечьку на него переползать?...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.12.2010, 09:04   #5
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
p.s. кстати, в языке C# этой проблемы нет! Может стоит потихонечьку на него переползать?...
Да не вжисть, Вы с Руби сравните... Там такой вопрос ТСа нет впринципе...
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 22.12.2010, 09:12   #6
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Сообщение от Sibedir Посмотреть сообщение
Почему локальные переменные нельзя объявлять следующим образом?
Ни почему. Просто не сделано. Face it.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 22.12.2010, 09:16   #7
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Сообщение от GunSmoker Посмотреть сообщение
Ни почему. Просто не сделано. Face it.
В корне неверное рассуждение. Дельфи наследник Паскаля, а каждая возможность (или недостаток) там обоснована, почитайте труды его автора.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 22.12.2010, 09:28   #8
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
Радость "Я так думаю" ©

Просто так писать удобнее. Да и где логика? Почему глобальные переменные при объявлении сразу запоняются (по умолчанию нулями), а локальные нет. Должно же быть логическое объяснение.
Предполагаю, это связано с тем, что глобальные переменные инициализируются воизбежание некоторых ошибок (когда новички забывают их инициализировать), а так как это делается 1 раз для каждой переменной, это совершенно не накладно. Сомнительная "защита от дурака", ибо, если бы обнуления не происходило, новичку было бы проще обнаружить ошибку. Она бы чаще возникала и это было бы видно по явно неадекватным результатам. Хотя опять же, Delphi разрешает, но придупреждает.
А вот с локальными переменными другая ситуация. Они могут по 100000 раз инициализироваться, а следовательно их обнуление накладно. Поэтому при объявлении происходит только процедура выделения памяти, а следовательно компилятору некуда пихать "= 1".
i: Integer {GetMem} = 1{некуда пихать};
Хотя, неужели было так сложно при компиляции проверять, есть ли "= Х" и, если есть, еще и скопировать Х в переменную.

Цитата:
Сообщение от Serge_Bliznykov
p.s. кстати, в языке C# этой проблемы нет! Может стоит потихонечьку на него переползать?...
О-о-ох, не трави душу. Да и это, с учетом вышесказанного, не то что бы проблема.

Кстати, это именно в C# или в Си вообще?

Последний раз редактировалось Sibedir; 22.12.2010 в 09:41.
Sibedir вне форума Ответить с цитированием
Старый 22.12.2010, 09:35   #9
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Насколько я помню локальные переменные размещаются в стеке, и каждый раз инициализировать их накладно.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 22.12.2010, 09:50   #10
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Сообщение от Utkin Посмотреть сообщение
В корне неверное рассуждение. Дельфи наследник Паскаля, а каждая возможность (или недостаток) там обоснована, почитайте труды его автора.
Yeah, right.

Особенно в Delphi не обоснованы классы, генерики и цикл for in.

К теме инициализации локальных переменных относится и case для строк.

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

Вот и ответ. Просто не сделали.

Цитата:
Сообщение от Sibedir Посмотреть сообщение
Да и где логика? Почему глобальные переменные при объявлении сразу запоняются (по умолчанию нулями), а локальные нет. Должно же быть логическое объяснение.
Смотря где искать логику, с какой точки зрения. С точки зрения практического использования языка - не очень много.

Но если с технической точки зрения... просто все глобальные переменные размещаются в отдельном сегменте исполняемого файла, который автоматически обнуляется при старте программы загрузчиком ОС. Т.е. это даже не язык, а ОС. Причём, это почти везде так, не только в Windows.

Цитата:
Сообщение от Utkin Посмотреть сообщение
Насколько я помню локальные переменные размещаются в стеке, и каждый раз инициализировать их накладно.
Можно подумать, если написать:

Код:
var
  I: Integer;
begin
  I := 1;
то это будет что, менее накладно?
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Переменные экземпляра,класса, константы и переменные cop08 Общие вопросы .NET 3 20.12.2010 21:56
Глобальные и локальные переменные Kapitann JavaScript, Ajax 2 03.08.2010 14:24
Как обычно делаются такие локальные переменные в методах классов? Oleg_SK Общие вопросы C/C++ 8 11.07.2010 04:09
Локальные и глобальные переменные. Proger10 Общие вопросы Delphi 1 04.05.2009 05:55
Локальные минимумы и их номера. f4rr3l Паскаль, Turbo Pascal, PascalABC.NET 5 06.01.2009 21:51