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

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

20.11.2015, 09:09. Просмотров 3103. Ответов 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
hoggy
Эксперт С++
7733 / 3497 / 724
Регистрация: 15.11.2014
Сообщений: 7,975
Завершенные тесты: 1
21.11.2015, 16:05 41
Цитата Сообщение от Gloat Посмотреть сообщение
Так, ну а что на счёт объявления 1000++ раз? Оно происходит или нет?
нет.

Цитата Сообщение от Gloat Посмотреть сообщение
просто не могу поверить что тот препод сказал левую информацию.
верить не нужно.
нужно знать.

ваш препод сморозил аццкую чушь,
которая противоречит здравому смыслу.

не нужно знать языки программирования и быть семи пядей во лбу, что бы понимать:
если бы на каждой итерации счетчик цикла каждый раз занового бы создавался,
стало быть, он на каждой итерации находился бы в состоянии инициализации,

ну и как тогда он смог бы итерироваться,
если каждый раз пересоздается?

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

Добавлено через 15 минут
Цитата Сообщение от Юля_программист Посмотреть сообщение
глобальные только те что определены вне функций, классов и пространств имен.
глобальные объекты - любые объекты, которые обладают "статическим классом хранения".

это означает,
что глобальный объект может быть определен как в теле функции,
так и внутри класса,
так и внутри пространства имен.


при этом , объекты,
которые при этом являются константами времени компиляции
(целые, указательные, ссылочные)
могут быть использованы в качестве параметров шаблона,
в силу статической природы их происхождения.

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

пример 1:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
const int v = 10; //<--- обычная глобальная переменная
 
template<int N> struct example
{
    enum { value = N };
};
 
int main()
{
    std::cout << "Hello, world!\n";
    std::cout <<" v = " << example<v>::value<<std::endl;
}

пример 2:

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
#include <iostream>
 
struct some
{
    int v = 10;
};
 
 
some obj;
 
template<some& OBJ> struct example
{
    example()
    {
        std::cout << "obj = "<< OBJ.v<<std::endl;
    }
};
 
 
int main()
{
    std::cout << "Hello, world!\n";
   
    example<obj>();  //<--- ссылка на статический объект можно использовать
       // в качестве параметра шаблона
}
примеров с неймспейсами не привожу, потому что мне лень.

можете самостоятельно упаковать объекты в неймспейсы, и убедиться,
что ничего не изменилось.
2
Kerry_Jr
Эксперт PHP
2262 / 2048 / 951
Регистрация: 14.05.2014
Сообщений: 6,005
Записей в блоге: 1
Завершенные тесты: 5
21.11.2015, 18:42 42
Цитата Сообщение от hoggy Посмотреть сообщение
глобальные объекты - любые объекты, которые обладают "статическим классом хранения".
статические - есть статические, глобальные - есть глобальные. У всего есть своя область видимости помимо времени жизни. Глобальные объекты видны из любой точки программы за исключением областей с перекрывающими объектами. Исправьте, если чушь несу.
1
Gloat
0 / 0 / 0
Регистрация: 17.10.2015
Сообщений: 26
21.11.2015, 19:38  [ТС] 43
Kerry_Jr,
Тогда при каждой итерации внешнего цикла будет создаваться переменная для внутреннего.
так при выходе из внутреннего цикла "j" будет удалена, а при новой итерации внешнего цикла опять создана, опять таки не вижу проблемы написать так
C++
1
2
3
4
5
6
7
for (int i = 0; i < 10; ++i)
{
    for (int j = 0; j < 20; ++j)
    {
        // TODO
    }
}
0
hoggy
Эксперт С++
7733 / 3497 / 724
Регистрация: 15.11.2014
Сообщений: 7,975
Завершенные тесты: 1
21.11.2015, 20:30 44
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
Глобальные объекты видны из любой точки программы за исключением областей с перекрывающими объектами. Исправьте, если чушь несу.
предлагаю вам саимм исправить,
приведя пример объекта со статическим классом хранения,
который при этом не является глобальным для данной единицы трансляции.


можно привести примеры, когда объект является глобальным толькои только
для данной единицы трансляции.
однако все подобныве техники - лишь для человеков.
с точки зрения кормпилятора, природа у них одинаковая.
0
Croessmah
++Ͻ
16155 / 9246 / 1774
Регистрация: 27.09.2012
Сообщений: 22,794
Записей в блоге: 2
Завершенные тесты: 2
21.11.2015, 21:07 45
Цитата Сообщение от hoggy Посмотреть сообщение
приведя пример объекта со статическим классом хранения,
который при этом не является глобальным для данной единицы трансляции.
C++
1
2
3
4
void foo()
{
   static int x = 0 ;
}
3.7.1 Static storage duration
2. The keyword static can be used to declare a local variable with static storage duration. [ Note: 6.7 describes
the initialization of local static variables; 3.6.3 describes the destruction of local static variables. — end
note ]
1
hoggy
Эксперт С++
7733 / 3497 / 724
Регистрация: 15.11.2014
Сообщений: 7,975
Завершенные тесты: 1
21.11.2015, 21:23 46
ну и чего хотел нам сообщить господин Croessmah
такого, чем ещё не собщил я выше?
0
Croessmah
++Ͻ
16155 / 9246 / 1774
Регистрация: 27.09.2012
Сообщений: 22,794
Записей в блоге: 2
Завершенные тесты: 2
21.11.2015, 21:28 47
нам
вам это кому?
Цитата Сообщение от hoggy Посмотреть сообщение
чем ещё не собщил я выше?
вот под это
Цитата Сообщение от hoggy Посмотреть сообщение
однако все подобныве техники - лишь для человеков.
с точки зрения кормпилятора, природа у них одинаковая.
можно подогнать почти что угодно.
1
hoggy
Эксперт С++
7733 / 3497 / 724
Регистрация: 15.11.2014
Сообщений: 7,975
Завершенные тесты: 1
21.11.2015, 21:34 48
Цитата Сообщение от Croessmah Посмотреть сообщение
вам это кому?
людям.


Croessmah
есть что добавить по существу?
0
Croessmah
++Ͻ
16155 / 9246 / 1774
Регистрация: 27.09.2012
Сообщений: 22,794
Записей в блоге: 2
Завершенные тесты: 2
21.11.2015, 21:36 49
Цитата Сообщение от hoggy Посмотреть сообщение
есть что добавить по существу?
Эта тема уже давно себя исчерпала.
1
Croessmah
++Ͻ
16155 / 9246 / 1774
Регистрация: 27.09.2012
Сообщений: 22,794
Записей в блоге: 2
Завершенные тесты: 2
21.11.2015, 21:44 50
Цитата Сообщение от hoggy Посмотреть сообщение
зачем вы мне тогда чегото писали?
аналогичный вопрос.
На Ваше
Цитата Сообщение от hoggy Посмотреть сообщение
глобальные объекты - любые объекты, которые обладают "статическим классом хранения".
ответ простой
local variable with static storage duration.
Перевод, надеюсь, не нужен.
Но
Цитата Сообщение от hoggy Посмотреть сообщение
точки зрения кормпилятора, природа у них одинаковая.
собственно и сам компилятор нужен
Цитата Сообщение от hoggy Посмотреть сообщение
лишь для человеков.
3
Kerry_Jr
Эксперт PHP
2262 / 2048 / 951
Регистрация: 14.05.2014
Сообщений: 6,005
Записей в блоге: 1
Завершенные тесты: 5
21.11.2015, 21:55 51
Цитата Сообщение от Gloat Посмотреть сообщение
так при выходе из внутреннего цикла "j" будет удалена
C++
1
2
3
4
5
for (int i = 0, j = 0; i < 2; ++i)
{
    std::cout << j << std::endl;
    for (j = 0; j < 2; ++j);
}
Ошибаетесь, но с этим мы уже разобрались - компилятор оптимизирует такие вещи.
1
hoggy
Эксперт С++
7733 / 3497 / 724
Регистрация: 15.11.2014
Сообщений: 7,975
Завершенные тесты: 1
21.11.2015, 21:58 52
Croessmah, ну и? вы сказать то что хотели?


может вы имели ввиду, что лямбды цепляют статические объекты, име к ним доступ, или как?
0
Croessmah
++Ͻ
16155 / 9246 / 1774
Регистрация: 27.09.2012
Сообщений: 22,794
Записей в блоге: 2
Завершенные тесты: 2
21.11.2015, 22:03 53
Цитата Сообщение от hoggy Посмотреть сообщение
вы сказать то что хотели?
то, что локальная переменная может обладать "статическим классом хранения". Но опять же, с точки зрения человеков это не глобальная переменная, а компилятор всё равно запихнет её туда же, куда и глобальные.
0
hoggy
Эксперт С++
7733 / 3497 / 724
Регистрация: 15.11.2014
Сообщений: 7,975
Завершенные тесты: 1
21.11.2015, 22:04 54
Цитата Сообщение от Croessmah Посмотреть сообщение
Перевод, надеюсь, не нужен.
не нужен, учитывая, что - лажа.


назовите основные отличия локального статика от глобального,
за искл. того что локальный не может быть параметром шабона?

Добавлено через 40 секунд
Цитата Сообщение от Croessmah Посмотреть сообщение
Но опять же, с точки зрения человеков это не глобальная переменная,
почему?
0
Croessmah
++Ͻ
16155 / 9246 / 1774
Регистрация: 27.09.2012
Сообщений: 22,794
Записей в блоге: 2
Завершенные тесты: 2
21.11.2015, 22:08 55
Цитата Сообщение от hoggy Посмотреть сообщение
почему?
Ну вот жалкие людишки пишут, что
В программировании локальной переменной называют переменную, объявленную внутри блока кода. Область видимости локальной переменной начинается в точке её объявления и заканчивается в конце этого блока. Например, в языке Си локальными являются переменные объявленные внутри функции или блока
а еще, некомпитентные людишки пишут
Статические локальные переменные
Статические переменные — это особый тип локальных переменных, доступен во многих популярных языках(включая c/c++, Visual Basic, VB.NET), суть его заключается в том, что эта переменная сохраняет в себе значение в каждом вызове функции.
Цитата Сообщение от hoggy Посмотреть сообщение
назовите основные отличия локального статика от глобального
локальный статик не виден за пределами функции.
3
Tulosba
:)
Эксперт С++
4759 / 3253 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
22.11.2015, 12:09 56
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
Глобальные объекты видны из любой точки программы за исключением областей с перекрывающими объектами.
Для доступа к глобальной переменной всегда можно использовать ::, если вдруг её перекрыла локальная одноименная переменная.
Цитата Сообщение от Croessmah Посмотреть сообщение
можно подогнать почти что угодно.
1
hoggy
Эксперт С++
7733 / 3497 / 724
Регистрация: 15.11.2014
Сообщений: 7,975
Завершенные тесты: 1
22.11.2015, 14:05 57
Цитата Сообщение от Croessmah Посмотреть сообщение
Ну вот жалкие людишки пишут, что
под "глобальной переменной" жалкие людишки
в первую очередь подразумевают глобальную точку доступа.

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

при этом совершенно монопенисуальный фактор,
как это будет выгледеть синтаксически:

вот так:
C++
1
2
3
4
void foo()
{
    auto value = gValue; // обычная глобальная переменная
}
или так:

C++
1
2
3
4
5
void foo()
{
    auto value = singelton::getInstance().getValue(); // Сингелтон маерса,
      // основанный на локальном статике
}
или как то ещё.

вот это вот - не глобальная переменная:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
namespace {
    some trololo;   // безымяный неймспейс сделает невозможным
     // доступ из других единиц трансляций
    // что противоречит определению "глобальной переменной" 
     //у жалких людишек.
 
   //несмотря на то, что переменная вполне себе глобально
   //относительно данной ед. трансляции
 
}; 
 
int foo()
{
    trololo.foo();
}
я специально акцентрирую ваше внимание на практической стороне вопроса:
как вы можете это использовать.

вот что является по настоящему интересным.

а не ваши занудные формальности:
итак понятно, что формально локальное глобальным быть не может,
иначе оно было бы глобальным, а не локальным.

вот только, если на практике,
локальное внезапно имеет природу глобального,
и способно удовлетворить все ваши потребности в глобальном,
значит по факту оно и есть глобальное.
0
22.11.2015, 14:05
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.11.2015, 14:05

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

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

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

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


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

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

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