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

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

20.11.2015, 09:09. Показов 7885. Ответов 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
13769 / 10962 / 6491
Регистрация: 18.12.2011
Сообщений: 29,238
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
Сообщений: 885
Записей в блоге: 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
Сообщений: 885
Записей в блоге: 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
Сообщений: 885
Записей в блоге: 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
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 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
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 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
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru