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

Объявляется ли каждую итерацию переменная-счетчик в цикле for?

20.11.2015, 09:09. Просмотров 3101. Ответов 56
Метки нет (Все метки)

Всем привет,
расскажу историю возникшего вопроса.
Отходил я как-то на курсы с++, и там преподаватель (авторитетный вроде программист, много где работал, в Бауманке преподавал) сказал следующее, цитирую:
"Очень часто я вижу, когда пишут вот такой вот лютый бред - for (int i = 0; i < n; i++){} - так никогда нельзя делать по причине того, что если цикл прокручивается например 1000 раз, то вы объявляете i 1000 раз, что не есть хорошо, а если цикл 1000000 раз прокрутится..? всегда пишите вот так -
int i;
for (i = 0; i < n; i++){}"
Вобщем-то я впитал эту информацию как губка, и всегда пишу так, как он сказал...
Друзья, прокомментируйте резонность его заявления, потому как, в виду того, что я НИКОГДА не вижу, чтобы объявление i выносили за цикл for, я начал сомневаться в этой информации, в конце концов ноль же не присваивается i каждый новый виток цикла, может этот кусок кода как-то игнорируется после первого прохода.., короче говоря, разложите пожалуйста по полкам.
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.11.2015, 09:09
Ответы с готовыми решениями:

Visual Studio 2008 Release - версия приложения, не объявляется переменная
Здравствуйте, у меня вопрос по Release-версии проекта. Есть проект, отладочная версия...

Функции. Не считает последнюю итерацию в цикле
Добрый вечер. Не могу понять, почему в цикле не считает 12 итерацию. Ниже строка с комментарием. ...

Как правильно вывести каждую итерацию цикла сортировки выбором
#include&lt;iostream&gt; #include&lt;conio.h&gt; #include&lt;cstdlib&gt; #include&lt;ctime&gt; using namespace std;...

Оптимизирует ли компилятор выражения в цикле типа 90*M_PI или каждую итерацию в цикле считает заново?
Занялся сабжем по проекту. IDE Builder 2010 1) Оптимизирует ли компилятор выражения в цикле типа...

Не объявляется переменная типа String
Добрый день. Возникла такая проблема: начал потихоньку разбираться в visual c++ и win forms. Однако...

56
Kosteks
1 / 1 / 0
Регистрация: 20.11.2015
Сообщений: 6
20.11.2015, 12:55 21
1) Мне почему-то сразу режет глаза код, где
C++
1
int i
вынесена за цикл.

Зачем писать лишние строки?

2) У Липпмана в книге сказано, что
оператор инициализации выполняется только однажды перед запуском цикла for...
Как я понимаю, при втором запуске цикла
C++
1
int i=1
уже не берется в расчет?!
Или я не так понял написанное в книге?

(Я сам только начал изучать язык)
0
Tulosba
:)
Эксперт С++
4759 / 3253 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
20.11.2015, 12:57 22
`НЕ` потерялось:
Цитата Сообщение от Tulosba Посмотреть сообщение
а цикл по-хорошему и НЕ должен быть на 100500 строк
Цитата Сообщение от Croessmah Посмотреть сообщение
Речь идет о объявлении этой "i" вне цикла.
Вне цикла не надо. Область видимости и время жизни не стоит расширять без надобности.
0
Croessmah
++Ͻ
16155 / 9246 / 1774
Регистрация: 27.09.2012
Сообщений: 22,794
Записей в блоге: 2
Завершенные тесты: 2
20.11.2015, 13:14 23
Цитата Сообщение от Tulosba Посмотреть сообщение
Область видимости и время жизни не стоит расширять без надобности.
а я о чем писал?
Цитата Сообщение от Croessmah Посмотреть сообщение
в таком случае переменная "i" будет существовать и после цикла, что нужно не всегда.
Цитата Сообщение от Croessmah Посмотреть сообщение
Вот так пишите только тогда, если после цикла нужно будет последнее значение "i" (правда, "i" лучше переменную не называть).
1
sourcerer
Модератор
Эксперт CЭксперт С++
4993 / 2175 / 330
Регистрация: 20.02.2013
Сообщений: 5,596
Записей в блоге: 24
Завершенные тесты: 1
20.11.2015, 13:21 24
Цитата Сообщение от Kosteks Посмотреть сообщение
Как я понимаю, при втором запуске цикла
C++
1
int i=1
уже не берется в расчет?!
В расчёт берётся. Просто объявление переменной i происходит один раз - перед началом цикла, а не на каждом витке, как утверждал преподаватель топикстартера.
2
Миниатюры
Объявляется ли каждую итерацию переменная-счетчик в цикле for?  
Tulosba
:)
Эксперт С++
4759 / 3253 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
20.11.2015, 13:30 25
Цитата Сообщение от Croessmah Посмотреть сообщение
а я о чем писал?
Так я же не возражаю
Так я же не возражаю
Так я же не возражаю
0
Kerry_Jr
20.11.2015, 13:40
  #26

Не по теме:

Croessmah, Tulosba, дальше ожидать четыре одинаковых ответа? :D

0
Croessmah
20.11.2015, 13:44
  #27

Не по теме:

Цитата Сообщение от Kerry_Jr Посмотреть сообщение
дальше ожидать четыре одинаковых ответа?
четыре четыре четыре четыре пять пять пять пять пять
Цитата Сообщение от Tulosba Посмотреть сообщение
Так я же не возражаю
так я тоже, но кажется, сударь, мы с Вами запутались немного :D

0
Gloat
0 / 0 / 0
Регистрация: 17.10.2015
Сообщений: 26
20.11.2015, 13:51  [ТС] 28
Croessmah, я с преподами не по наслышке знаком, и все бы было на своих местах, но дело в том, что он препод по совместительству, а так судя по резюме он и на службы работал и в НИИ консультантом был, поэтому думаю к нему это
Данная статья посвящена принципам преподавательской работы.
...
Люди относятся к преподаванию по-разному. Есть такие, кто ни за что в жизни преподавать не пойдут. Еще Сенека Старший говорил: «Кого боги хотят покарать, того они делают педагогом». Персидское изречение гласит: «Если бы небо услышало молитвы детей, на свете не осталось бы ни одного живого учителя». Джордж Бернард Шоу высказался так: «Кто умеет, делает; кто не умеет, учит других». Питер Лоренс продолжил, но уже в юмористическом ключе: «Кто умеет, делает; кто не умеет, учит других; а кто не умеет и этого, учит учителей». Есть еще более жесткие варианты: «Если ничего не умеешь делать - иди преподавать»; «Человек становится учёным, когда обучает сам себя, - и преподавателем, когда поучает других».
не совсем относится, а из института ушёл по его словам, что там преподование шлаковым стало
0
sourcerer
Модератор
Эксперт CЭксперт С++
4993 / 2175 / 330
Регистрация: 20.02.2013
Сообщений: 5,596
Записей в блоге: 24
Завершенные тесты: 1
20.11.2015, 13:56 29
Gloat, "Errare humanum est". Какой бы он (препод) ни был офигенный, в данном конкретном случае он ошибается, в силу того простого факта, что он тоже человек.
1
Gloat
0 / 0 / 0
Регистрация: 17.10.2015
Сообщений: 26
20.11.2015, 13:58  [ТС] 30
gru74ik,
он тоже человек
полностью согласен.
в данном конкретном случае он ошибается
фраза которая поставила все точки над и
0
rikimaru2013
2523 / 1184 / 356
Регистрация: 30.11.2013
Сообщений: 3,810
20.11.2015, 13:59 31
Цитата Сообщение от Gloat Посмотреть сообщение
не совсем относится
Самое интересное, что мы обсуждаем компетентность программиста-преподавателя с слов студента-двоечника, который не так понял, не то увидил, но так ощутил.

P.S. "студента-двоечника" использовалось, чтобы подчеркнуть моё отношение к ТСу после 16 поста с многими звёздочками про человека, что учил тебя программирвоать
3
sourcerer
Модератор
Эксперт CЭксперт С++
4993 / 2175 / 330
Регистрация: 20.02.2013
Сообщений: 5,596
Записей в блоге: 24
Завершенные тесты: 1
20.11.2015, 14:04 32
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
с слов студента-двоечника, который не так понял, не то увидил, но так ощутил
Ну или да - ТС не так и не то.
0
Gloat
0 / 0 / 0
Регистрация: 17.10.2015
Сообщений: 26
20.11.2015, 14:06  [ТС] 33
rikimaru2013, нуу я уже не студент, а когда был им, двоичником не был, ))) а по поводу "не то услышал не так понял", он это зярядил на самом первом занятии, и цитату я привел в точности (кроме может слова "лютый"), постарайтесь поверить на слово, к тому же, тема не для обсуждения препода, а для проверки полученной информации.., на мой взгляд, такой подход уже не делает меня двоечником!

Добавлено через 59 секунд
gru74ik, как бы то нибыло.., зато разобрался!
0
sourcerer
Модератор
Эксперт CЭксперт С++
4993 / 2175 / 330
Регистрация: 20.02.2013
Сообщений: 5,596
Записей в блоге: 24
Завершенные тесты: 1
20.11.2015, 14:07 34
Цитата Сообщение от Gloat Посмотреть сообщение
зато разобрался!
Это хорошо.
0
_Ivana
4265 / 1975 / 249
Регистрация: 01.03.2013
Сообщений: 5,312
Записей в блоге: 22
20.11.2015, 14:35 35
Очередная тема категоричного двоечника про то, какие преподы дураки?

Во-первых, когда картины в пещерах рисовали, тезис препода вполне мог быть актуальным.

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

И как следствие, многие якобы не нужные традиции и паттерны имеет смысл применять даже если в данном случае это неважно - т.к. это может подстраховать "в более лютых случаях" (С) (как с ++i и i++). Хотя ограничение области видимости внутри блока, с другой стороны, тоже плюс.
0
Gloat
0 / 0 / 0
Регистрация: 17.10.2015
Сообщений: 26
20.11.2015, 14:39  [ТС] 36
_Ivana,
Очередная тема категоричного двоечника про то, какие преподы дураки?
ну тема вообще не про это, ну да ладно...
0
Kerry_Jr
Эксперт PHP
2262 / 2048 / 951
Регистрация: 14.05.2014
Сообщений: 6,005
Записей в блоге: 1
Завершенные тесты: 5
20.11.2015, 15:15 37
Цитата Сообщение от Gloat Посмотреть сообщение
все точки над и
которую не следует объявлять вне цикла, повторю слова Croessmah'а, если на то нет особой нужды.
0
Voivoid
710 / 282 / 16
Регистрация: 31.03.2013
Сообщений: 1,339
20.11.2015, 15:33 38
Цитата Сообщение от _Ivana Посмотреть сообщение
Во-первых, когда картины в пещерах рисовали, тезис препода вполне мог быть актуальным.
Хотя бы гипотетически можешь представить себе такую архитектуры в которой это было бы актуально? Я что-то не особо.

Цитата Сообщение от _Ivana Посмотреть сообщение
И как следствие, многие якобы не нужные традиции и паттерны имеет смысл применять даже если в данном случае это неважно
Ага. И вот так рождаются каргокультисты
0
Kerry_Jr
Эксперт PHP
2262 / 2048 / 951
Регистрация: 14.05.2014
Сообщений: 6,005
Записей в блоге: 1
Завершенные тесты: 5
21.11.2015, 14:38 39
Gloat, преподаватель может быть прав в ситуации, если цикл вложенный. Тогда при каждой итерации внешнего цикла будет создаваться переменная для внутреннего. Но это лечится созданием счетчика внутреннего цикла в блоке инициализации внешнего.
C++
1
2
3
4
5
6
7
for (int i = 0, j; i < 10; ++i)
{
    for (j = 0; j < 20; ++j)
    {
        // TODO
    }
}
1
Tulosba
:)
Эксперт С++
4759 / 3253 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
21.11.2015, 14:50 40
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
может быть прав в ситуации, если цикл вложенный
И компилятор при этом должен быть видимо очень тупым и старым. Даже при отсутствии оптимизаций -O0 асм-код получился идентичным. Проверить можно на http://gcc.godbolt.org/
2
21.11.2015, 14:50
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.11.2015, 14:50

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Где объявляется Глобальная переменная в C++ ?
Где объявляется Глобальная переменная в C++ ?

Добавлять next() каждую итерацию цикла
Всем привет такой вопрос, мне требуется в цикле проверять каждый следующий элемент в списке (это...

Пояснить, почему переменная объявляется как int
При чтении книги &quot;Язык программирования С&quot; (2-е издание) Кернигана и Ритчи у меня возник ряд...


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

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

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