Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
Киберпанк
1 / 1 / 1
Регистрация: 11.01.2015
Сообщений: 26
#1

Объявление переменной внутри цикла while

06.03.2015, 05:58. Просмотров 1237. Ответов 6
Метки нет (Все метки)

Доброго времени суток, форумчане.
Расскажите нубу, что происходит при объявлении объявленной переменной. Знаю, звучит глупо, посему объясняю, с чего мне такой бред вообще в голову то стукнул... На примере.
C++
1
2
3
4
5
while(...) {
    int nX;
    // ... //
    nX++;
}
Эдакий вот циклик в n проходов. Что будет происходить при каждом объявлении переменной? И как это можно записать красивее, если мне нужно, чтоб переменная, отработавшая внутри цикла, дестроилась по выходу из него.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.03.2015, 05:58
Ответы с готовыми решениями:

Определение переменной внутри цикла
Кусочек кода #include <iostream> #include <iomanip> #include <fstream> ...

Применение цикла if для определения простых чисел. If внутри цикла for
Доброго времени суток, подскажите пожалуйста, в чем тут дело. С кодом все...

Объявление внутри switch
Почему, когда закомментирваны фигурные скобки не получается объявить переменную...

Объявление объекта внутри функции
Здраствуйте. У меня такой вопрос: есть класс class A { public: A():...

Ругань на объявление массива внутри класса
Задание: создать класс-контейнер, реализующий политику FIFO. Имею код: ...

6
ValeryS
Модератор
7223 / 5485 / 683
Регистрация: 14.02.2011
Сообщений: 18,550
06.03.2015, 06:34 #2
Цитата Сообщение от Киберпанк Посмотреть сообщение
Что будет происходить при каждом объявлении переменной?
а кто его знает
скорее всего будет подхватывать старые значения, но не факт
удалилась место освободилось, опять объявилась на том же месте
или в регистре
но не факт
Цитата Сообщение от Киберпанк Посмотреть сообщение
чтоб переменная, отработавшая внутри цикла, дестроилась по выходу из него.
new deleten ?????
или что значит дестроилась
ежли ты пытаешься таким образом память уменьшить, то ничего не получится
объявление переменных в листинге и выделение памяти в системе, две разные задачи,
0
hoggy
Нарушитель
Эксперт С++
7054 / 3100 / 643
Регистрация: 15.11.2014
Сообщений: 7,062
Завершенные тесты: 1
06.03.2015, 06:38 #3
Цитата Сообщение от Киберпанк Посмотреть сообщение
Что будет происходить при каждом объявлении переменной?
имя nX будет детонировать объект размером sizeof(int)

Цитата Сообщение от Киберпанк Посмотреть сообщение
если мне нужно, чтоб переменная, отработавшая внутри цикла, дестроилась по выходу из него.
В представленном вами примере, переменная nX прекратит свое существовании по завершению цикла.
0
Киберпанк
1 / 1 / 1
Регистрация: 11.01.2015
Сообщений: 26
06.03.2015, 06:41  [ТС] #4
Цитата Сообщение от ValeryS Посмотреть сообщение
а кто его знает
Ну кто-то же наверняка знает. Сделал программку маленькую, протестить - подхватывала. Но как-то оно некрасиво, авось когда-нибудь крабом станет... То-бишь станет раком и пойдёт боком.
Цитата Сообщение от ValeryS Посмотреть сообщение
или что значит дестроилась
Это значит, что после цикла я должен получить:
error: ‘nX’ was not declared in this scope.
Цитата Сообщение от ValeryS Посмотреть сообщение
объявление переменных в листинге и выделение памяти в системе, две разные задачи,
Подробнее, пожалуйста. Буду благодарен за ссылочки/литературу.
Цитата Сообщение от hoggy Посмотреть сообщение
будет детонировать объект
А подробнее? Опять-таки за ссылочки буду благодарен.
Цитата Сообщение от hoggy Посмотреть сообщение
В представленном вами примере
У меня го-код, а как это сделать красивее?
0
Renji
2102 / 1543 / 470
Регистрация: 05.06.2014
Сообщений: 4,473
06.03.2015, 06:49 #5
Цитата Сообщение от Киберпанк Посмотреть сообщение
Подробнее, пожалуйста. Буду благодарен за ссылочки/литературу.
Там особо нечего подробнее объяснять. Есть большой (ажно мегабайт по умолчанию), непрерывный кусок памяти называемый стеком. Каждая функция при вызове отпиливает себе кусочек стека и кладет в него свои локальные переменные. Как там она их распихает - ее личное дело. А по завершении функции кусочек возвращается обратно в стек. Если у вас нет 100500 вложенных вызовов, каждый из которых нарожал локальных переменных на десять килобайт, экономить на стеке смыслу никакого. Может во времена "640 килобайт хватит всем" смысл и был, но не сейчас.
1
ValeryS
Модератор
7223 / 5485 / 683
Регистрация: 14.02.2011
Сообщений: 18,550
06.03.2015, 06:59 #6
Цитата Сообщение от Киберпанк Посмотреть сообщение
Ну кто-то же наверняка знает.
Никто не знает это так называемое UB "неопределенное поведение" как компилятор пожелает так и сделает, в приведенном примере может вообще nX выбросить, пользы от него все равно нет
Цитата Сообщение от Киберпанк Посмотреть сообщение
Подробнее, пожалуйста. Буду благодарен за ссылочки/литературу.
а нет такой ссылочки
все на собственном опыте, берешь дизасемблер, компилятор, лучше несколько, и смотришь во что листинг превращается
Литературу могу посоветовать поискать Криса Касперски "Фундаментальные основы хакерства", "Техника отладки программ без исходных кодов" и еще несколько книг, его же статьи из журнала "Хакер"
Ну и документацию к компиляторам, стандарт С++

Добавлено через 3 минуты
Цитата Сообщение от hoggy Посмотреть сообщение
переменная nX прекратит свое существовании по завершению цикла.
Уйдет из области видимости, т.е стандартными средствами до неё не достучатся
а вот память очистится, когда компилятору удобно будет
1
hoggy
Нарушитель
Эксперт С++
7054 / 3100 / 643
Регистрация: 15.11.2014
Сообщений: 7,062
Завершенные тесты: 1
06.03.2015, 07:13 #7
Цитата Сообщение от Киберпанк Посмотреть сообщение
А подробнее? Опять-таки за ссылочки буду благодарен.
поподробнее у Страуструпа.

Имя обозначает (денотирует) объект, функцию, тип, значение или метку. Имя вводится в программе описанием (#8). Имя может использоваться только внутри области текста программы, называемой его областью видимости. Имя имеет тип, определяющий его использование. Объект - это область памяти. Объект имеет класс памяти, определяющий его время жизни. Смысл значения, обнаруженного в объекте, определяется типом имени, использованного для доступа к нему.
(ц)старина Бъярни
http://www.tud.ttu.ee/im/Kaarel.Allik/COOP/Stoustrup/ref1_7.htm

Цитата Сообщение от ValeryS Посмотреть сообщение
Уйдет из области видимости, т.е стандартными средствами до неё не достучатся
а вот память очистится, когда компилятору удобно будет
Разумеется.

Цитата Сообщение от Киберпанк Посмотреть сообщение
Это значит, что после цикла я должен получить:
error: ‘nX’ was not declared in this scope.
Вы и получите это.
Сразу же, как только имя выйдет за пределы своей видимости.

Переменная объявленная в теле цикла не существует за его пределами.

Цитата Сообщение от Киберпанк Посмотреть сообщение
У меня го-код, а как это сделать красивее?
Можно нарисовать цветочки, ромашками разукрасить в асски арт, например.
1
06.03.2015, 07:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.03.2015, 07:13

Объявление переменных внутри блока switch
#include <iostream> int main() { int choice = 2; ...

Объявление переменной
Два вопроса: 1) Чем отличается запись: int a = 10; От: int a(10); 2)...

Объявление переменной
Доброго времени суток. Возник вопрос, по какой причине при следующей форме...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru