Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> стек в цикле, стек в цикле 
:(
    Опции темы
hawk3500
Дата 1.11.2011, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Здравствуйте, подскажите пожалуйста, когда я создаю цикл к примеру
for(int tmp=0;tmp<100;tmp++)
{
.....
}
Как инициализируется переменная tmp?
Скомпилировав такой примерчик в студии и посмотрев через IDA я увидел что tmp является регистровой переменной.
Вопрос в том всегда ли так?
А также важен вопрос, если у меня есть вложенные циклы for и где то во вложенном цикле я делаю прыжок(jmp) за пределы всех циклов, тем самым совершая выход ,это корректно?
Вот пример такой ситуации:
Код

for(int i=0;i<7;i++)
{
   for(int j=0;j<7;j++)
   {
      for(int k=0;k<7;k++)
      {
         if(k==5)goto DOWN;
      }
   }
}
DOWN:

--------------------
воин dzen'a
PM MAIL   Вверх
baldina
Дата 1.11.2011, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(hawk3500 @  1.11.2011,  13:04 Найти цитируемый пост)
 я увидел что tmp является регистровой переменной.
Вопрос в том всегда ли так?

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

Цитата(hawk3500 @  1.11.2011,  13:04 Найти цитируемый пост)
 я делаю прыжок(jmp) за пределы всех циклов, тем самым совершая выход ,это корректно?

конечно

Добавлено через 1 минуту и 18 секунд
переменные i,j,k конечно уже не будут существовать, т.к. их время жизни закончилось с концом блока

Добавлено через 7 минут и 44 секунды
конструкторы/деструкторы отработают при этом корректно
http://codepad.org/6jDkc0T1
PM MAIL   Вверх
math64
Дата 1.11.2011, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Кроме того, если в теле цикла были созады на стеке переменные, имеющие деструктор, эти деструкторы будут вызваны перед выполнением goto/break/continue
PM   Вверх
hawk3500
Дата 1.11.2011, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Огромное спасибо за ответ.
Теперь этот аспект мне ясен.
--------------------
воин dzen'a
PM MAIL   Вверх
Dem_max
Дата 2.11.2011, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



есть правда всякие gcc у них такой код проходит
Код

for(int k=0;k<7;k++)
{
   for(k=0;k<7;k++) // k объявлена в другом for
   {

         if(k==5)goto DOWN;

   }
}



--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
bsa
Дата 2.11.2011, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Dem_max @  2.11.2011,  10:12 Найти цитируемый пост)
есть правда всякие gcc у них такой код проходит

и что в этом коде криминального с точки зрения стандарта (с точки зрения логики и так все видно)? На С++ это всегда должно компилироваться. На Си стандарта ниже С99 могут быть ошибки из-за объявления переменной внутри оператора for.
PM   Вверх
Dem_max
Дата 2.11.2011, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



нет я имел ввиду что для второго цикла K уже объявлена в первом.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
bsa
Дата 2.11.2011, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Dem_max @  2.11.2011,  13:40 Найти цитируемый пост)
нет я имел ввиду что для второго цикла K уже объявлена в первом. 

И что в этом такого? "int k" - это обычная переменная, которая ведет себя, как другие переменные.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




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


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

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