0 / 0 / 0
Регистрация: 12.04.2009
Сообщений: 47
|
|
1 | |
две переменные с одинаковым именем16.07.2009, 15:33. Показов 9281. Ответов 24
Метки нет (Все метки)
Вопрос скорее теоретический:
Использую Visual C++ , запускаю debug и в окошечке переменных вижу, например, две переменные с именем i. Возникает такая ситуация, если в коде встречается несколько циклов типа for(int i = 0; ...). Причем, например, если цикл двойной, то вторая переменная не дублируется (по крайней мере, не всегда). Можно конечно для каждого цикла называть переменный по разному, но ведь по и идее они на то и локальные, чтобы не было конфликтов? Есть ли смысл с этим бороться? Если да, то как? Может ли хотя бы теоретически случится, что эти переменные перепутаются?
0
|
16.07.2009, 15:33 | |
Ответы с готовыми решениями:
24
Задание нескольких #region с одинаковым именем. Нормально ли это? Виртуальные функции с одинаковым именем и разным набором аргументов Создать два класса с одинаковым именем в разных пространствах имен fputs и две переменные |
depict1
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
|
|
16.07.2009, 15:40 | 2 |
версия MSVC какая?
окошечко переменных как называется? Watch?
0
|
Айхрень...
306 / 176 / 7
Регистрация: 02.06.2009
Сообщений: 1,077
|
|
16.07.2009, 15:40 | 3 |
Перепутаться скорее всего могут только, если цикл будет внутри другого цикла. А так в целом всё должно быть тип-том. Конечно, тогда нежелательно, чтобы одна из них была глобальной...
0
|
0 / 0 / 0
Регистрация: 12.04.2009
Сообщений: 47
|
|
16.07.2009, 16:04 [ТС] | 4 |
циклы отдельно, все переменные локальные. По идее ничего не должно путаться, но настораживает. Решила спросить специалистов...
Добавлено через 5 минут 11 секунд студия 2005, окошечко называется locals. Это важно? мне не ясно, почему локальная переменная при выходе из цикла не уничтожается, вернее, уничтожается не всегда. Или на самом деле она уничтожается, но остается запись в окне?
0
|
depict1
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
|
|
16.07.2009, 16:09 | 5 |
да. на вкладке Watch вы можете дублировать названия переменных.
это очень легко проверить. вместо переменной встроенного типа создайте переменную класса. в его деструкторе выводите диагностическое сообщение на экран. и сами увидите - уничтожается, или нет. кстати, приведите пример проблемного кода. *** вполне возможно, что это баг студии. она у вас не самая новая.
1
|
3071 / 1409 / 425
Регистрация: 19.01.2009
Сообщений: 3,878
|
||||||
16.07.2009, 16:20 | 6 | |||||
Нет они никогда не перепутаются, т.к. в С/С++ есть такое понятие, область видимости переменной. Если говорить о функция, то проще сказать, что ее область видимости распростаняется на весь блок от начальной { до конечной }, в котором она объяевлена. Но есть и такое понятие, как перекрытие. Вот пример:
1
|
0 / 0 / 0
Регистрация: 12.04.2009
Сообщений: 47
|
||||||
16.07.2009, 16:37 [ТС] | 7 | |||||
например при выполнении вот такой вот функции:
0
|
depict1
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
|
|
16.07.2009, 16:58 | 8 |
отличная функция, большая
не могли бы вы локализовать проблему, придумав маааленькую функцию/кусок кода, в котором возникает проблема.
0
|
0 / 0 / 0
Регистрация: 12.04.2009
Сообщений: 47
|
||||||
16.07.2009, 17:17 [ТС] | 9 | |||||
действительно, чего это я.... сорри.
Вот тут та же проблема (2 i , но 1 j в окошке locals):
0
|
depict1
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
|
|
16.07.2009, 17:27 | 10 |
2
|
0 / 0 / 0
Регистрация: 12.04.2009
Сообщений: 47
|
|
16.07.2009, 17:37 [ТС] | 11 |
значит, так быть таки не должно? но это только проблема отображения и никак не влияет на выполнение программы?
0
|
depict1
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
|
|
16.07.2009, 17:39 | 12 |
конечно не должно. переменные локальные. при выходе из области видимости они больше не должны быть видны в окне отладки.
да. это только проблема отображения.
0
|
0 / 0 / 0
Регистрация: 12.04.2009
Сообщений: 47
|
|
16.07.2009, 17:54 [ТС] | 13 |
Ок, еще раз спасибо
0
|
229 / 67 / 11
Регистрация: 02.06.2009
Сообщений: 280
|
||||||
16.07.2009, 18:00 | 14 | |||||
Нет никакого смысла, это предрешено.
а можно еще и не плодить переменных
0
|
0 / 0 / 0
Регистрация: 12.04.2009
Сообщений: 47
|
|
16.07.2009, 18:02 [ТС] | 15 |
тогда переменная уже не будет локальной, а меня учили что этого стоит избегать?
0
|
depict1
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
|
|
16.07.2009, 18:04 | 16 |
0
|
229 / 67 / 11
Регистрация: 02.06.2009
Сообщений: 280
|
|
16.07.2009, 18:08 | 17 |
Делай локальные переменные в ф-ции, а не в куске кода, и компилятор твой не будет тебя пытатся ввести в оману в окошке авто.
Добавлено через 2 минуты 22 секунды Обоснуй.
0
|
depict1
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
|
|
16.07.2009, 18:15 | 18 |
во-первых, переменная должна служить одной единственной цели.
во-вторых, время жизни переменной должно быть не больше, чем необходимо. в данном случае переменная i становится не нужной, когда мы выходим из второй пары вложенных циклов. в вашем же случае она будет видима до конца блока кода. и не факт что при модификации/сопровождении исходного кода переменная i всегда будет находиться в инвариантном состоянии. ничто не гарантирует того, что программист будет помнить каждый раз сбрасывать переменную в ноль при попытке её очередного использования. вы со мной не согласны? можете мне снизить репутацию ещё раз тогда, если вы от этого получаете удовлетворение
0
|
229 / 67 / 11
Регистрация: 02.06.2009
Сообщений: 280
|
|
16.07.2009, 20:21 | 19 |
Это прекрасно подходит и к вынесеному итератору.
Не все компиляторы схавают. Например, студия 6, не скомпилирует такой код ( а проектов под неё еще дофига). Будут проблемы с типом такой переменной, если функция вылезет за 1 экран - то попробуй вспомни, какой сейчас тип имеет эта переменная, если её переобъявили 2 раза под разными типами. Невозможность возвратить текущее значение итератора за пределы цикла.
0
|
depict1
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
|
|
16.07.2009, 20:29 | 20 |
нигде не было сказано, что значение счётчика (не итератора как вы употребляете) должно где-то использоваться вне цикла.
откуда такие сведения, что под VS 6.0 проектов "дофига"? все проекты уже давно переписаны минимум под 2003 студию. к сожалению вы не понимаете о чём говорите. может быть через какое-то время вы перерастёте этот этап "ребячества" и поймёте, какие глупости вы говорили. дальнейшие нравоучения считаю бесполезными.
0
|
16.07.2009, 20:29 | |
16.07.2009, 20:29 | |
Помогаю со студенческими работами здесь
20
Нужно приравнять две переменные Не меняются местами две переменные Как сравнить две переменные string Даны две переменные целого типа: A и B. Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |