Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.51/35: Рейтинг темы: голосов - 35, средняя оценка - 4.51
0 / 0 / 0
Регистрация: 17.10.2015
Сообщений: 26

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

20.11.2015, 09:09. Показов 8156. Ответов 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)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.11.2015, 09:09
Ответы с готовыми решениями:

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

Может ли переменная X использоваться как счётчик в цикле, в теле которого вычисляется заданная функция?
Может ли переменная х быть параметром (управляющей переменной) в операторе цикла с параметром если в цикле вычисляется функция y=f(x) при 0...

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

56
Котовчанин
942 / 482 / 200
Регистрация: 16.02.2010
Сообщений: 3,338
Записей в блоге: 35
20.11.2015, 10:52
Лучший ответ Сообщение было отмечено Gloat как решение

Решение

Gloat, разница только в видимости переменной. Как бы, правильнее - делать видимость переменных как можно меньше, потому запись for (int i = 0; i < n; i++){} - самое оно.

Добавлено через 2 минуты
Gloat, пример. Есть цикл, назову операции буквами, чтобы было проще.
for (A; B; C) { }
Тк вот.
А - выполнится ДО начала всех итераций(один раз выполнилось и всё)
В - перед каждой будет выполняться.
С - после каждой.
1
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,246
20.11.2015, 10:54
Добавлю, аналог такого for через while
C++
1
2
3
4
5
6
7
8
{
   int i=0;
   while(i<n)
   {
      ....
      i++;
   }
}
1
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
20.11.2015, 10:55
Цитата Сообщение от Gloat Посмотреть сообщение
вот лютый бред
Цитата Сообщение от Gloat Посмотреть сообщение
если цикл прокручивается например 1000 раз, то вы объявляете i 1000 раз
так правильней.
1
0 / 0 / 0
Регистрация: 17.10.2015
Сообщений: 26
20.11.2015, 10:55  [ТС]
Так, ну а что на счёт объявления 1000++ раз? Оно происходит или нет? потому как если не происходит, то дейстиветьльно, делать так как вы говорите "самое оно", просто не могу поверить что тот препод сказал левую информацию. Надо было его доколупать на этут тему.., ну знал просто совсем мало, поэтому принимал на веру всё...
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
20.11.2015, 10:57
zss, ту можно и через goto написать, смысл от этого не изменится. Единственное, что можно сказать, - преподавателя в топку вместе с его "Бауманкой".

Добавлено через 37 секунд
Цитата Сообщение от Gloat Посмотреть сообщение
Так, ну а что на счёт объявления 1000++ раз?
Цитата Сообщение от Тамика Посмотреть сообщение
А - выполнится ДО начала всех итераций(один раз выполнилось и всё)
вам уже ответили
1
 Аватар для Юля_программист
682 / 192 / 60
Регистрация: 04.05.2012
Сообщений: 886
Записей в блоге: 1
20.11.2015, 10:58
Стало и мне интересно)
Решила попробовать)
Плюс я помню как то писала программу в университете и с преподавателем долго думали, что не так цикл ходил не по той переменной,а потом нашли ошибку, как раз в var.

Накидала код:
Сначала такой:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int main()
{
   int mass[]={1,2,3,4,5,6};
   int i=0;
 
    for(i=0;i<=3;i++){
        cout<<"\n FOR 1 - "<<mass[i];
    }
    i=i+1;
    cout<<"\n"<<i;
 
 
    cout<<"\n"<<i;
 
    cout<<"\nTwo";
    for(i;i<=5;i++){
        cout<<"\n FOR 2 - "<<mass[i];
    }
 
    cout<<"\n"<<i;
 
    return 0;
}
Потом такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int main()
{
   int mass[]={1,2,3,4,5,6};
   int i=0;
 
    for(int i=0;i<=3;i++){
        cout<<"\n FOR 1 - "<<mass[i];
    }
    i=i+1;
    cout<<"\n"<<i;
 
 
    cout<<"\n"<<i;
 
    cout<<"\nTwo";
    for(int i;i<=5;i++){
        cout<<"\n FOR 2 - "<<mass[i];
    }
 
    cout<<"\n"<<i;
 
    return 0;
}
Все переменные выведены для наглядности разности объявления.

Не по теме:

Для гуру С++:так конечно не пишут, я про отсутствие инициализации в цикле.Но зато сразу видно различия в объявлении.



Потом еще заглянула в пару книг и пришла к такому выводу:
Первый случай переменная глобальная,и если ее изменить где то в теле программы, она может повлиять на работу цикла(у меня было такое, я пыталась получить ту ошибку, чтобы показать, но не получилось). Тут продолжается нумерация дальше.Т.е. после цикла переменная i=4 и в теле программы она дальше работает с этим значением.
А второе переменная видна только в теле цикла, т.е. она локальная для цикла. И не будет использоваться вне цикла.
Миниатюры
Объявляется ли каждую итерацию переменная-счетчик в цикле for?  
Изображения
 
1
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
20.11.2015, 11:04
Цитата Сообщение от Юля_программист Посмотреть сообщение
переменная глобальная
переменная локальная для функции main.

Добавлено через 3 минуты
Цитата Сообщение от Юля_программист Посмотреть сообщение
C++
1
for(int i;i<=5;i++){
здесь в i в зависимости от компилятора может лежать все, что угодно.
1
 Аватар для Юля_программист
682 / 192 / 60
Регистрация: 04.05.2012
Сообщений: 886
Записей в блоге: 1
20.11.2015, 11:06
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
переменная локальная для функции main.
Верно, спасибо за поправку.
Сейчас посмотрела в книгу Страуструпа и действительно глобальные только те что определены вне функций, классов и пространств имен.

Добавлено через 1 минуту
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
здесь в i в зависимости от компилятора, может лежать все, что угодно.
Это я знаю, просто хотела показать наглядно что нумерация идет дальше.

В сообщении я указала:
Для гуру С++:так конечно не пишут, я про отсутствие инициализации в цикле.Но зато сразу видно различия в объявлении.
1
0 / 0 / 0
Регистрация: 17.10.2015
Сообщений: 26
20.11.2015, 11:07  [ТС]
Юля_программист, во втором коде очепятка или для чего-то сделано int i = 0 до for'а и внутри? Как это называется... переопределение?
0
 Аватар для Юля_программист
682 / 192 / 60
Регистрация: 04.05.2012
Сообщений: 886
Записей в блоге: 1
20.11.2015, 11:12
Цитата Сообщение от Gloat Посмотреть сообщение
Юля_программист, во втором коде очепятка или для чего-то сделано int i = 0 до for'а и внутри?
Я просто хотела показать разницу)
В первом случае
Цитата Сообщение от Юля_программист Посмотреть сообщение
i=i+1;
i=4+1=5, а во втором i=0+1)
так сразу нагляднее было видно)
Переменная не для цикла была,а для счета, чтобы увидеть как меняется i)
1
0 / 0 / 0
Регистрация: 17.10.2015
Сообщений: 26
20.11.2015, 11:35  [ТС]
понял, понял, с определением разобрались, а что на счет объявления, может я говорю абсурдные вещи, но, было ли какое-то лишнее объявление мы проверить вот так кодом не можем(и вообще возможно ли такое?)?! Вообще как посмотреть механизм работы цикла for, а то написали в учебнике мол - это до цикла делается это после.., а реализовано это как, это надо смотреть ассемблерный код или.., или что?
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
20.11.2015, 11:37
Цитата Сообщение от Gloat Посмотреть сообщение
Вобщем-то я впитал эту информацию как губка, и всегда пишу так, как он сказал...
когда-нибудь Вас за это побьют коллеги, ибо в таком случае переменная "i" будет существовать и после цикла, что нужно не всегда.
Цитата Сообщение от Gloat Посмотреть сообщение
то вы объявляете i 1000 раз
объявляется она только один раз, во время выполнения память под нее в стеке также будет выделена только один раз.
Цитата Сообщение от Gloat Посмотреть сообщение
я начал сомневаться в этой информации
Это раньше могло быть актуально, в древние времена, когда еще программисты в пещерах картинки рисовали, сейчас же
Цитата Сообщение от Gloat Посмотреть сообщение
пишите вот так -
int i;
for (i = 0; i < n; i++){}"
Вот так пишите только тогда, если после цикла нужно будет последнее значение "i" (правда, "i" лучше переменную не называть).
Как по мне, то лучше уж обратил бы внимание на то, что лучше писать ++i, чтобы по привычке потом с более сложными сущностями не написать i++.
Цитата Сообщение от Gloat Посмотреть сообщение
Очень часто я вижу, когда пишут вот такой вот лютый бред
Видать, очень крутой препод, умнее всех на свете. Таких в универах много.
У нас вот вирусы по звукам их размножения искала, норм так, чё
3
Котовчанин
942 / 482 / 200
Регистрация: 16.02.2010
Сообщений: 3,338
Записей в блоге: 35
20.11.2015, 11:37
Gloat, http://en.cppreference.com/w/cpp/language/for
Вряд ли нужно знать более глубоко, чем то, что описано здесь. Хотя я могу и ошибаться.
1
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
20.11.2015, 11:41
Цитата Сообщение от Gloat Посмотреть сообщение
мы проверить вот так кодом не можем?!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream>
using namespace std;
 
 
class Foo
{
private:
    int m_num;
public:
    Foo(const int x) : 
        m_num(x)
    {
        cout << "ctor(x) " << endl;
    }
    Foo()
    {
        cout << "ctor " << endl;
    }
    int operator++()
    {
        cout << "prefix increment " << endl;
        return ++m_num;
    }
    operator int()
    {
        cout << "convert to int for compare with int" << endl;
        return m_num;
    }
 
};
 
 
int main()
{
 
    for(Foo i = 0; i < 5; ++i)
    {
        cout << "body of for calls" << endl;
    }
    cout << "#### end" << endl;
 
}
2
0 / 0 / 0
Регистрация: 17.10.2015
Сообщений: 26
20.11.2015, 12:16  [ТС]
Croessmah,
когда-нибудь Вас за это побьют коллеги, ибо в таком случае переменная "i" будет существовать и после цикла, что нужно не всегда.
Ну сомневаться-то я начал ))))
Вот так пишите только тогда, если после цикла нужно будет последнее значение "i" (правда, "i" лучше переменную не называть).
Как по мне, то лучше уж обратил бы внимание на то, что лучше писать ++i, чтобы по привычке потом с более сложными сущностями не написать i++.
ну на сколько я знаю в плюсах появилась такая чудесная возможность как объявление переменной в любой части кода, тобишь объявить её (переменную) можно непосредственно возле места где она используется, собственно о чём это я...
C++
1
2
3
4
5
6
7
8
9
int i;
for(i = 0; i < n; i++){bla}
blabla;
bla;
for (i = 0; i < m;i++){bla} // вместо объявления и определения просто переопределение (почему бы и нет?!)
int f(){bla;
bla;
return bla;}
i = f();// опять таки почему бы просто не переопределить?!
Вот за такое меня будут бить?

Добавлено через 18 минут
rikimaru2013, попробовал код, да действительно, конструктор по умолчанию не вызывается )))
короче говоря, из всего что я прочитал, я понял что "авторитетный препод" сморозил (собственно, зачем я это всё и спрашивал), буду знать, спасибо.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
20.11.2015, 12:21
Цитата Сообщение от Gloat Посмотреть сообщение
резонность его заявления
Препод бредит. То, что он предлагает, делалось раньше (до C99) в чистых сях из-за ограничений мест объявления переменных.
Цикл for(A;B;C) D; разворачивается по сути в следующую последовательность А; while(B) {D; C;}. Как можно видеть, А выполняется только 1 раз.
2
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
20.11.2015, 12:23
Цитата Сообщение от Gloat Посмотреть сообщение
Вот за такое меня будут бить?
Одна переменная - одно смысловое значение.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
20.11.2015, 12:35
Цитата Сообщение от Croessmah Посмотреть сообщение
(правда, "i" лучше переменную не называть
Для локального использования, а цикл по-хорошему и должен быть на 100500 строк, короткие имена предпочтительнее. А i для цикла так вообще самое популярное имя де-факто.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
20.11.2015, 12:40
Цитата Сообщение от Tulosba Посмотреть сообщение
Для локального использования, а цикл по-хорошему и должен быть на 100500 строк, короткие имена предпочтительнее. А i для цикла так вообще самое популярное имя де-факто.
Речь идет о объявлении этой "i" вне цикла.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.11.2015, 12:40
Помогаю со студенческими работами здесь

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

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

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

Вывести итерацию в цикле
Здравствуйте, заадание такое: дан отрезок с шагом h. Сделать тремя способами: с параметром, предусловием и постусловием. Для расчетов...

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru