Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Странные вещи с For 
:(
    Опции темы
maestro2k
Дата 20.3.2007, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 13.4.2006

Репутация: нет
Всего: нет



Сранности с  For. Подскажите баг или фичя.
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
begin
  for i:= 1 to 2 do
  begin
    //
  end;
  ShowMessage(IntToStr(i));
end;

ShowMessage - показывает цифру 3. как так получается если цикл всего до 2-х?
PM MAIL   Вверх
Guedda
Дата 20.3.2007, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 14
Всего: 78



Это цикл с постусловием. Поэтому после прохождения полного цикла переменная увеличивается ещё на один. Моё ИМХО.


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
maestro2k
Дата 20.3.2007, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 13.4.2006

Репутация: нет
Всего: нет



нет это непричем, так тоже..
Код

  for i:= 1 to 10 do
  begin
    Sleep(1);
  end;
  ShowMessage(IntToStr(i));

показывает 11.
Может это у меня что то с делфи?..

Это сообщение отредактировал(а) maestro2k - 20.3.2007, 17:43
PM MAIL   Вверх
MBo
Дата 20.3.2007, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 10.6.2002

Репутация: 3
Всего: 18



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

Это сообщение отредактировал(а) MBo - 20.3.2007, 17:49
PM MAIL   Вверх
~FoX~
Дата 20.3.2007, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 13
Всего: 68



maestro2k, Нет.....Цикл закончен - условие i:=1 to 10 выполнено......следующая итерация не помещается в условие и происходит выход из цикла....По идеи место i может занять любое другое значение

Это сообщение отредактировал(а) ~FoX~ - 20.3.2007, 17:52


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
Rodman
Дата 20.3.2007, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 7
Всего: 122



~FoX~, 
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  i,j: integer;
begin
  j:=0;
  for i:= 1 to 2 do
  begin
    inc(j);
  end;
  ShowMessage(IntToStr(j));
end;


та же трабла...

PM MAIL WWW Skype GTalk YIM MSN   Вверх
Snowy
Дата 20.3.2007, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Какая трабла?
Вы дебагером пройдите.
Дойдя до конца цикла, переменная уведичивается на еденицу и управление передаётся на начало цикла.
Там идёт проверка - а не конец ли? И, если конец, переход за цикл.
Естественно переменная будет на 1 больше, т.к. после последней итерации ей в конце цикла прилипили ещё еденицу.
Кстати, почитайте варнинки - там для вас пишут - не юзайте переменную за циклом ;-)
PM MAIL   Вверх
ama_kid
Дата 20.3.2007, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 15
Всего: 95



Rodman 
какая трабла?
цикл выполняется 2 раза (когда i=1 и когда i=2) - следовательно инкремент j происходит тоже 2 раза: 0->1 и 1->2
В итоге выводит 2 (у меня, по крайней мере...)


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
Pakshin A. S.
Дата 20.3.2007, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



Код

for i:=1 to 3 do
 begin end;


Аналогичный цикл по своей функциональности:
Код

i:=1;
while i <= 3 do
  inc(i);


Хотите сказать, что и он не верно работает?

Добавлено @ 18:38 
Простой пример:
Код

  for i:=1 to 3 do
    Memo1.Lines.Add(IntToStr(i));
  Memo1.Lines.Add('');
  i:=1;
  while i <= 3 do
    begin
      Memo1.Lines.Add(IntToStr(i));
      inc(i);
    end;
  Memo1.Lines.Add('');
  i:=1;
  repeat
    Memo1.Lines.Add(IntToStr(i));
    inc(i);
  until i > 3;

Показывает то, что все циклы работают верно: от единицы до трех.
За циклами всегда i будет на единицу больше тройки, так как только при этом условии будет произведен выход из цикла.
PM   Вверх
skyboy
Дата 20.3.2007, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 4
Всего: 260



Цитата(MBo @  20.3.2007,  16:48 Найти цитируемый пост)
По стандарту языка Паскаль переменная цикла for после выхода из него не определена, так что ее значение может быть каким угодно, и использовать его нельзя.

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

Добавлено @ 18:51 
Цитата(Delphi 7 Help)

After the for statement terminates (provided this was not forced by a break or an exit procedure), the value of counter is undefined.

PM MAIL   Вверх
Yanis
Дата 20.3.2007, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



Цитата(Pakshin A. S. @  20.3.2007,  19:33 Найти цитируемый пост)
Хотите сказать, что и он не верно работает?

Нет. Этого никто не говорил. А вот про for следует раз и навсегда запомнить цитату из хелпа: 

Код
[I]for counter := initialValue to finalValue do statement[/I]
After the for statement terminates (provided this was not forced by a break or an exit procedure), the value of counter is undefined.

Так о чём спор?

Цитата(skyboy @  20.3.2007,  19:50 Найти цитируемый пост)
очень верное замечание. жаль, что его вовремя не заметили - дискуссия бы не развилась...

Верно.


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0680 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.