Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.86
Etudiante
0 / 0 / 0
Регистрация: 12.04.2009
Сообщений: 47
#1

две переменные с одинаковым именем - C++

16.07.2009, 15:33. Просмотров 1864. Ответов 24
Метки нет (Все метки)

Вопрос скорее теоретический:

Использую Visual C++ , запускаю debug и в окошечке переменных вижу, например, две переменные с именем i. Возникает такая ситуация, если в коде встречается несколько циклов типа for(int i = 0; ...). Причем, например, если цикл двойной, то вторая переменная не дублируется (по крайней мере, не всегда). Можно конечно для каждого цикла называть переменный по разному, но ведь по и идее они на то и локальные, чтобы не было конфликтов? Есть ли смысл с этим бороться? Если да, то как? Может ли хотя бы теоретически случится, что эти переменные перепутаются?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.07.2009, 15:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос две переменные с одинаковым именем (C++):

Виртуальные функции с одинаковым именем и разным набором аргументов - C++
Есть абстрактный базовый класс и пара наследников. class Base { public: vurtual void Func(int a); vurtual void Func(int...

Задание нескольких #region с одинаковым именем. Нормально ли это? - C++
Могу ли я указывать несколько #region с одинаковыми именами в рамках одного файла или в рамках некоторого проекта. Не противоречит ли это...

fputs и две переменные - C++
Всем здравствуйте. Не ругайте сильно ибо туплю по страшному. Видимо из-за полусонного состояния. Подскажите как правильно записать две...

Нужно приравнять две переменные - C++
Помогите пожалуйста, никак не могу приравнять рандомное число к a.nom. Создается рандомное число которое потом должно приравняться к a.nom...

Не меняются местами две переменные - C++
Пытаюсь поменять местами две переменные через ассемблерные вставки. Почему нет результата? #include <iostream> using namespace std; ...

Как сравнить две переменные string - C++
Есть две переменные типа string в одной записано string X="AB BA AS AX"; В другой string Y="AB"; В строке X cимволы...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
16.07.2009, 18:04 #16
Цитата Сообщение от Etudiante Посмотреть сообщение
тогда переменная уже не будет локальной, а меня учили что этого стоит избегать
вас правильно учили. не слушайте Alexandoros. он говорит глупости.
Alexandoros
228 / 66 / 4
Регистрация: 02.06.2009
Сообщений: 280
16.07.2009, 18:08 #17
Цитата Сообщение от Etudiante Посмотреть сообщение
тогда переменная уже не будет локальной, а меня учили что этого стоит избегать?
Делай локальные переменные в ф-ции, а не в куске кода, и компилятор твой не будет тебя пытатся ввести в оману в окошке авто.

Добавлено через 2 минуты 22 секунды
Цитата Сообщение от zim22 Посмотреть сообщение
он говорит глупости.
Обоснуй.
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
16.07.2009, 18:15 #18
Цитата Сообщение от Alexandoros Посмотреть сообщение
Обоснуй.
во-первых, переменная должна служить одной единственной цели.
во-вторых, время жизни переменной должно быть не больше, чем необходимо.
в данном случае переменная i становится не нужной, когда мы выходим из второй пары вложенных циклов. в вашем же случае она будет видима до конца блока кода.
и не факт что при модификации/сопровождении исходного кода переменная i всегда будет находиться в инвариантном состоянии. ничто не гарантирует того, что программист будет помнить каждый раз сбрасывать переменную в ноль при попытке её очередного использования.
вы со мной не согласны? можете мне снизить репутацию ещё раз тогда, если вы от этого получаете удовлетворение
Alexandoros
228 / 66 / 4
Регистрация: 02.06.2009
Сообщений: 280
16.07.2009, 20:21 #19
Цитата Сообщение от zim22 Посмотреть сообщение
во-первых, переменная должна служить одной единственной цели.
во-вторых, время жизни переменной должно быть не больше, чем необходимо.
Это прекрасно подходит и к вынесеному итератору.


Цитата Сообщение от zim22 Посмотреть сообщение
в данном случае переменная i становится не нужной, когда мы выходим из второй пары вложенных циклов. в вашем же случае она будет видима до конца блока кода.
и не факт что при модификации/сопровождении исходного кода переменная i всегда будет находиться в инвариантном состоянии. ничто не гарантирует того, что программист будет помнить каждый раз сбрасывать переменную в ноль при попытке её очередного использования.
Не все компиляторы схавают. Например, студия 6, не скомпилирует такой код ( а проектов под неё еще дофига).

Будут проблемы с типом такой переменной, если функция вылезет за 1 экран - то попробуй вспомни, какой сейчас тип имеет эта переменная, если её переобъявили 2 раза под разными типами.

Невозможность возвратить текущее значение итератора за пределы цикла.
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
16.07.2009, 20:29 #20
Цитата Сообщение от Alexandoros Посмотреть сообщение
Невозможность возвратить текущее значение итератора за пределы цикла.
нигде не было сказано, что значение счётчика (не итератора как вы употребляете) должно где-то использоваться вне цикла.

Цитата Сообщение от Alexandoros Посмотреть сообщение
Не все компиляторы схавают. Например, студия 6, не скомпилирует такой код ( а проектов под неё еще дофига).
откуда такие сведения, что под VS 6.0 проектов "дофига"? все проекты уже давно переписаны минимум под 2003 студию.
Цитата Сообщение от Alexandoros Посмотреть сообщение
Будут проблемы с типом такой переменной, если функция вылезет за 1 екран - то попробуй вспомни, какой сейчас тип имеет эта переменная, если её переобъявили 2 раза под разными типами.
к сожалению вы не понимаете о чём говорите. может быть через какое-то время вы перерастёте этот этап "ребячества" и поймёте, какие глупости вы говорили.
дальнейшие нравоучения считаю бесполезными.
Alexandoros
228 / 66 / 4
Регистрация: 02.06.2009
Сообщений: 280
17.07.2009, 14:04 #21
Цитата Сообщение от zim22 Посмотреть сообщение
нигде не было сказано, что значение счётчика (не итератора как вы употребляете) должно где-то использоваться вне цикла.
Этот комент чистой воды игра слов, ни смысловой ни полезной нагрузки.


Цитата Сообщение от zim22 Посмотреть сообщение
откуда такие сведения, что под VS 6.0 проектов "дофига"? все проекты уже давно переписаны минимум под 2003 студию.
Из собственного опыта. Если у европейских заказчиков куплена студия 6, то они абсолютно не спешат покупать что-то новое, тем более, если все их проекты прекрасно работают.

Цитата Сообщение от zim22 Посмотреть сообщение
к сожалению вы не понимаете о чём говорите. может быть через какое-то время вы перерастёте этот этап "ребячества" и поймёте, какие глупости вы говорили.
дальнейшие нравоучения считаю бесполезными.
Опять вода.

Я давно коммерчески программирую, и я советую практику, а не полет мысли теоретичского художника.
odip
Эксперт С++
7157 / 3297 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
20.07.2009, 21:05 #22
Не все компиляторы схавают. Например, студия 6, не скомпилирует такой код ( а проектов под неё еще дофига).
Visual Studio 6 вообще не соблюдает стандарты C++, так что если она что-то там не скопилирует - не страшно.

2Alexandoros, 2zim22: Вы уже от темы отклоняетесь ...
Search..
Заказ софта
340 / 185 / 10
Регистрация: 26.05.2009
Сообщений: 863
20.07.2009, 23:29 #23
Цитата Сообщение от zim22 Посмотреть сообщение
я сообщу Microsoft о баге.

Не по теме:

Хоть кто-то делает полезное дело. Уважаю !

Monte-Cristo
21.07.2009, 00:29
  #24

Не по теме:

odip, а ты мне покажи компилятор C++ массовго распространения который бы их соблюдал? Таковых нет... Наиболее близок к стандарту gcc (на мое imho).. Но при разработки проектов в интегрированных средах разработки (аля VS, Builder) отклонение от стандарта облегчает процесс написание программы учитывая специфику среды разработки.

zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
21.07.2009, 09:02 #25
как оказалось, это не баг, а фича.
вот ссылка на полное описание
Hello,

Thank you for taking the time to report this. The behavior you are seeing is the result of the way the compiler is designed, and not an actual bug. The compiler moves loop control variables into the enclosing scope for debugging purposes so they can be inspected even after execution has passed the termination point of the loop. So in the example you provided, both i's and j's are still in existence for debugging purposes for the reminder of the body of "main()" once they have been declared.

Best Regards,
Andrew Hall
Visual Studio Debugger
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.07.2009, 09:02
Привет! Вот еще темы с ответами:

Даны две переменные целого типа: A и B. - C++
Даны две переменные целого типа: A и B. Если их значения не равны, то присвоить каждой переменной сумму этих значений, а если равны, то...

Нужно сравнить две переменные типа string - C++
Мне нужно сравнить 2 переменные типа string,нашел эту функцию,но почему то у меня выдает ошибку Error:class "std...

Сравнить две переменные и изменить их значения по результатам сравнения - C++
Даны две переменные целого типа: A и B. Если их значения не равны, то присвоить каждой переменной сумму этих значений, а если равны, то...

Определить массив, создать две переменные типа указатель и сравнить - C++
Определить одномерный массив размерностью 10 элементов, * значение которых целого типа (заполнять вручную). * Создать две переменные...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
21.07.2009, 09:02
Ответ Создать тему
Опции темы

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