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

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

20.11.2015, 09:09. Просмотров 2999. Ответов 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
Тамика
Котовчанин
931 / 471 / 200
Регистрация: 16.02.2010
Сообщений: 3,323
Записей в блоге: 37
20.11.2015, 10:52 2
Лучший ответ Сообщение было отмечено Gloat как решение

Решение

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

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

Добавлено через 37 секунд
Цитата Сообщение от Gloat Посмотреть сообщение
Так, ну а что на счёт объявления 1000++ раз?
Цитата Сообщение от Тамика Посмотреть сообщение
А - выполнится ДО начала всех итераций(один раз выполнилось и всё)
вам уже ответили
1
Юля_программист
489 / 146 / 45
Регистрация: 04.05.2012
Сообщений: 715
Записей в блоге: 1
20.11.2015, 10:58 7
Стало и мне интересно)
Решила попробовать)
Плюс я помню как то писала программу в университете и с преподавателем долго думали, что не так цикл ходил не по той переменной,а потом нашли ошибку, как раз в 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 и в теле программы она дальше работает с этим значением.
А второе переменная видна только в теле цикла, т.е. она локальная для цикла. И не будет использоваться вне цикла.
1
Изображения
Тип файла: jpg 1.JPG (10.1 Кб, 1 просмотров)
Тип файла: jpg 2.JPG (11.3 Кб, 84 просмотров)
Kerry_Jr
Эксперт PHP
2249 / 2037 / 949
Регистрация: 14.05.2014
Сообщений: 5,969
Записей в блоге: 1
Завершенные тесты: 5
20.11.2015, 11:04 8
Цитата Сообщение от Юля_программист Посмотреть сообщение
переменная глобальная
переменная локальная для функции main.

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

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

В сообщении я указала:
Для гуру С++:так конечно не пишут, я про отсутствие инициализации в цикле.Но зато сразу видно различия в объявлении.
1
Gloat
0 / 0 / 0
Регистрация: 17.10.2015
Сообщений: 26
20.11.2015, 11:07  [ТС] 10
Юля_программист, во втором коде очепятка или для чего-то сделано int i = 0 до for'а и внутри? Как это называется... переопределение?
0
Юля_программист
489 / 146 / 45
Регистрация: 04.05.2012
Сообщений: 715
Записей в блоге: 1
20.11.2015, 11:12 11
Цитата Сообщение от Gloat Посмотреть сообщение
Юля_программист, во втором коде очепятка или для чего-то сделано int i = 0 до for'а и внутри?
Я просто хотела показать разницу)
В первом случае
Цитата Сообщение от Юля_программист Посмотреть сообщение
i=i+1;
i=4+1=5, а во втором i=0+1)
так сразу нагляднее было видно)
Переменная не для цикла была,а для счета, чтобы увидеть как меняется i)
1
Gloat
0 / 0 / 0
Регистрация: 17.10.2015
Сообщений: 26
20.11.2015, 11:35  [ТС] 12
понял, понял, с определением разобрались, а что на счет объявления, может я говорю абсурдные вещи, но, было ли какое-то лишнее объявление мы проверить вот так кодом не можем(и вообще возможно ли такое?)?! Вообще как посмотреть механизм работы цикла for, а то написали в учебнике мол - это до цикла делается это после.., а реализовано это как, это надо смотреть ассемблерный код или.., или что?
0
Croessmah
++Ͻ
16056 / 9155 / 1758
Регистрация: 27.09.2012
Сообщений: 22,533
Записей в блоге: 2
Завершенные тесты: 2
20.11.2015, 11:37 13
Цитата Сообщение от Gloat Посмотреть сообщение
Вобщем-то я впитал эту информацию как губка, и всегда пишу так, как он сказал...
когда-нибудь Вас за это побьют коллеги, ибо в таком случае переменная "i" будет существовать и после цикла, что нужно не всегда.
Цитата Сообщение от Gloat Посмотреть сообщение
то вы объявляете i 1000 раз
объявляется она только один раз, во время выполнения память под нее в стеке также будет выделена только один раз.
Цитата Сообщение от Gloat Посмотреть сообщение
я начал сомневаться в этой информации
Это раньше могло быть актуально, в древние времена, когда еще программисты в пещерах картинки рисовали, сейчас же
Цитата Сообщение от Gloat Посмотреть сообщение
пишите вот так -
int i;
for (i = 0; i < n; i++){}"
Вот так пишите только тогда, если после цикла нужно будет последнее значение "i" (правда, "i" лучше переменную не называть).
Как по мне, то лучше уж обратил бы внимание на то, что лучше писать ++i, чтобы по привычке потом с более сложными сущностями не написать i++.
Цитата Сообщение от Gloat Посмотреть сообщение
Очень часто я вижу, когда пишут вот такой вот лютый бред
Видать, очень крутой препод, умнее всех на свете. Таких в универах много.
У нас вот вирусы по звукам их размножения искала, норм так, чё
3
Тамика
Котовчанин
931 / 471 / 200
Регистрация: 16.02.2010
Сообщений: 3,323
Записей в блоге: 37
20.11.2015, 11:37 14
Gloat, http://en.cppreference.com/w/cpp/language/for
Вряд ли нужно знать более глубоко, чем то, что описано здесь. Хотя я могу и ошибаться.
1
rikimaru2013
2517 / 1179 / 355
Регистрация: 30.11.2013
Сообщений: 3,792
20.11.2015, 11:41 15
Цитата Сообщение от 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
Gloat
0 / 0 / 0
Регистрация: 17.10.2015
Сообщений: 26
20.11.2015, 12:16  [ТС] 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
Tulosba
:)
Эксперт С++
4756 / 3250 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
20.11.2015, 12:21 17
Цитата Сообщение от Gloat Посмотреть сообщение
резонность его заявления
Препод бредит. То, что он предлагает, делалось раньше (до C99) в чистых сях из-за ограничений мест объявления переменных.
Цикл for(A;B;C) D; разворачивается по сути в следующую последовательность А; while(B) {D; C;}. Как можно видеть, А выполняется только 1 раз.
2
Croessmah
++Ͻ
16056 / 9155 / 1758
Регистрация: 27.09.2012
Сообщений: 22,533
Записей в блоге: 2
Завершенные тесты: 2
20.11.2015, 12:23 18
Цитата Сообщение от Gloat Посмотреть сообщение
Вот за такое меня будут бить?
Одна переменная - одно смысловое значение.
0
Tulosba
:)
Эксперт С++
4756 / 3250 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
20.11.2015, 12:35 19
Цитата Сообщение от Croessmah Посмотреть сообщение
(правда, "i" лучше переменную не называть
Для локального использования, а цикл по-хорошему и должен быть на 100500 строк, короткие имена предпочтительнее. А i для цикла так вообще самое популярное имя де-факто.
0
Croessmah
++Ͻ
16056 / 9155 / 1758
Регистрация: 27.09.2012
Сообщений: 22,533
Записей в блоге: 2
Завершенные тесты: 2
20.11.2015, 12:40 20
Цитата Сообщение от Tulosba Посмотреть сообщение
Для локального использования, а цикл по-хорошему и должен быть на 100500 строк, короткие имена предпочтительнее. А i для цикла так вообще самое популярное имя де-факто.
Речь идет о объявлении этой "i" вне цикла.
0
20.11.2015, 12:40
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.11.2015, 12:40

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

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

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


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

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

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