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

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

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

Студворк — интернет-сервис помощи студентам
Вопрос скорее теоретический:

Использую Visual C++ , запускаю debug и в окошечке переменных вижу, например, две переменные с именем i. Возникает такая ситуация, если в коде встречается несколько циклов типа for(int i = 0; ...). Причем, например, если цикл двойной, то вторая переменная не дублируется (по крайней мере, не всегда). Можно конечно для каждого цикла называть переменный по разному, но ведь по и идее они на то и локальные, чтобы не было конфликтов? Есть ли смысл с этим бороться? Если да, то как? Может ли хотя бы теоретически случится, что эти переменные перепутаются?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.07.2009, 15:33
Ответы с готовыми решениями:

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

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

Создать два класса с одинаковым именем в разных пространствах имен
создать два класса с одинаковым именем, которые находятся в разных пространствах имён, например т1, т2. В пространстве имён std объявите...

24
depict1
 Аватар для zim22
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
16.07.2009, 15:40
Цитата Сообщение от Etudiante Посмотреть сообщение
Использую Visual C++
версия MSVC какая?
Цитата Сообщение от Etudiante Посмотреть сообщение
g и в окошечке переменных вижу
окошечко переменных как называется? Watch?
0
Айхрень...
 Аватар для Paulie
306 / 176 / 7
Регистрация: 02.06.2009
Сообщений: 1,077
16.07.2009, 15:40
Перепутаться скорее всего могут только, если цикл будет внутри другого цикла. А так в целом всё должно быть тип-том. Конечно, тогда нежелательно, чтобы одна из них была глобальной...
0
0 / 0 / 0
Регистрация: 12.04.2009
Сообщений: 47
16.07.2009, 16:04  [ТС]
циклы отдельно, все переменные локальные. По идее ничего не должно путаться, но настораживает. Решила спросить специалистов...

Добавлено через 5 минут 11 секунд
Цитата Сообщение от zim22 Посмотреть сообщение
версия MSVC какая?

окошечко переменных как называется? Watch?
студия 2005, окошечко называется locals. Это важно? мне не ясно, почему локальная переменная при выходе из цикла не уничтожается, вернее, уничтожается не всегда. Или на самом деле она уничтожается, но остается запись в окне?
0
depict1
 Аватар для zim22
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
16.07.2009, 16:09
Цитата Сообщение от Etudiante Посмотреть сообщение
Это важно?
да. на вкладке Watch вы можете дублировать названия переменных.
Цитата Сообщение от Etudiante Посмотреть сообщение
Или на самом деле она уничтожается, но остается запись в окне?
это очень легко проверить. вместо переменной встроенного типа создайте переменную класса. в его деструкторе выводите диагностическое сообщение на экран. и сами увидите - уничтожается, или нет.
кстати, приведите пример проблемного кода.
***
вполне возможно, что это баг студии. она у вас не самая новая.
1
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,893
16.07.2009, 16:20
Цитата Сообщение от Etudiante Посмотреть сообщение
Может ли хотя бы теоретически случится, что эти переменные перепутаются?
Нет они никогда не перепутаются, т.к. в С/С++ есть такое понятие, область видимости переменной. Если говорить о функция, то проще сказать, что ее область видимости распростаняется на весь блок от начальной { до конечной }, в котором она объяевлена. Но есть и такое понятие, как перекрытие. Вот пример:
C++
1
2
3
4
5
6
7
8
void foo() {
  int i;
  i = 1;
  for (int i=0; i<10; i++) {
       printf("%d\n", i);
  }
  printf("%d", i);
}
Второе объяление переменной i перекрывает первую и компилятор уже работает с этой переменной, но когда цикл заканчивается, то под i понимается уже первая переменная.
1
0 / 0 / 0
Регистрация: 12.04.2009
Сообщений: 47
16.07.2009, 16:37  [ТС]
Цитата Сообщение от zim22 Посмотреть сообщение
да. на вкладке Watch вы можете дублировать названия переменных.

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

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
void CellIndexation(const PvMatrix::Matrix<double>& imageBin, PvMatrix::Matrix<double>& imageLabel)
{
     int k = 1;
     int d = 0;
     int count1=1;
     int count2=10;
     ForwardLabeling_0(imageBin, imageLabel, k);
 
     while(count1 !=0 && count2!=0)
     {
         count1 = 0;
         BackwardLabeling(imageLabel);
 
         ForwardLabeling(imageLabel, count1);
         count2--;
     }
 
         int  Number_cell=1;
     CellLabel labelCell;
     bool flag = false;
 
    for (int i = 0, cont = 1; cont &&  i < imageLabel.GetSize1(); i++)
        for (int j = 0; j < imageLabel.GetSize2(); j++)
            if (imageLabel(i, j)) 
            {
                  labelCell.push_back(imageLabel(i, j));
                  cont = 0;
                  break;
            }
 
 
 
    
         int z = 0;
    for(int i=0; i<imageLabel.GetSize1(); ++i)
    {
         for(int j=0; j<imageLabel.GetSize2(); ++j)
         {
              if(imageLabel(i,j)!=0)
              {
                  z=0;
                  for(int k = 0; k<labelCell.size(); ++k)
                  {
                      if(imageLabel(i,j)==labelCell.at(k))
                      {
                          z=1;
                          break;
                      }
                      
                  }
                  if(z==0)
                      {
                      labelCell.push_back(imageLabel(i,j));
                      Number_cell++;
                      imageLabel(i,j)= Number_cell;
                       }
                      }
              }
         }
    }
 
        
}
тут "дублируются " i и k (с k я уже вижу, что один раз объявила ее глобально, второй раз локально. Сейчас исправлю). Но не дублируется, например, j.
0
depict1
 Аватар для zim22
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
16.07.2009, 16:58
Цитата Сообщение от Etudiante Посмотреть сообщение
например при выполнении вот такой вот функции:
отличная функция, большая
не могли бы вы локализовать проблему, придумав маааленькую функцию/кусок кода, в котором возникает проблема.
0
0 / 0 / 0
Регистрация: 12.04.2009
Сообщений: 47
16.07.2009, 17:17  [ТС]
Цитата Сообщение от zim22 Посмотреть сообщение
отличная функция, большая
не могли бы вы локализовать проблему, придумав маааленькую функцию/кусок кода, в котором возникает проблема.
действительно, чего это я.... сорри.
Вот тут та же проблема (2 i , но 1 j в окошке locals):

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
void Test(int s)
{
    for(int i =0; i<10; ++i)
    {
        for(int j=0; j<10; j++)
        {
            ++s;
        }
    }
 
    for(int i =0; i<10; ++i)
    {
        for(int j=0; j<10; j++)
        {
            --s;
        }
    }
}
 
int main()
{
printf("%d", s);
return 0;
}
0
depict1
 Аватар для zim22
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
16.07.2009, 17:27
Цитата Сообщение от Etudiante Посмотреть сообщение
Вот тут та же проблема (2 i , но 1 j в окошке locals):
у меня такой же глюк. ок, я сообщу Microsoft о баге.
2
0 / 0 / 0
Регистрация: 12.04.2009
Сообщений: 47
16.07.2009, 17:37  [ТС]
значит, так быть таки не должно? но это только проблема отображения и никак не влияет на выполнение программы?
0
depict1
 Аватар для zim22
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
16.07.2009, 17:39
Цитата Сообщение от Etudiante Посмотреть сообщение
значит, так быть таки не должно?
конечно не должно. переменные локальные. при выходе из области видимости они больше не должны быть видны в окне отладки.
Цитата Сообщение от Etudiante Посмотреть сообщение
? но это только проблема отображения и никак не влияет на выполнение программы?
да. это только проблема отображения.
0
0 / 0 / 0
Регистрация: 12.04.2009
Сообщений: 47
16.07.2009, 17:54  [ТС]
Ок, еще раз спасибо
0
229 / 67 / 11
Регистрация: 02.06.2009
Сообщений: 280
16.07.2009, 18:00
Цитата Сообщение от Etudiante Посмотреть сообщение
Есть ли смысл с этим бороться?
Нет никакого смысла, это предрешено.

а можно еще и не плодить переменных

C++
1
2
3
4
5
6
7
{
   int i;
 
  for(i = 0;;)...
   for(i = 0;;)...
   for(i = 0;;)...
}
0
0 / 0 / 0
Регистрация: 12.04.2009
Сообщений: 47
16.07.2009, 18:02  [ТС]
тогда переменная уже не будет локальной, а меня учили что этого стоит избегать?
0
depict1
 Аватар для zim22
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
16.07.2009, 18:04
Цитата Сообщение от Etudiante Посмотреть сообщение
тогда переменная уже не будет локальной, а меня учили что этого стоит избегать
вас правильно учили. не слушайте Alexandoros. он говорит глупости.
0
229 / 67 / 11
Регистрация: 02.06.2009
Сообщений: 280
16.07.2009, 18:08
Цитата Сообщение от Etudiante Посмотреть сообщение
тогда переменная уже не будет локальной, а меня учили что этого стоит избегать?
Делай локальные переменные в ф-ции, а не в куске кода, и компилятор твой не будет тебя пытатся ввести в оману в окошке авто.

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


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

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

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

Цитата Сообщение от Alexandoros Посмотреть сообщение
Не все компиляторы схавают. Например, студия 6, не скомпилирует такой код ( а проектов под неё еще дофига).
откуда такие сведения, что под VS 6.0 проектов "дофига"? все проекты уже давно переписаны минимум под 2003 студию.
Цитата Сообщение от Alexandoros Посмотреть сообщение
Будут проблемы с типом такой переменной, если функция вылезет за 1 екран - то попробуй вспомни, какой сейчас тип имеет эта переменная, если её переобъявили 2 раза под разными типами.
к сожалению вы не понимаете о чём говорите. может быть через какое-то время вы перерастёте этот этап "ребячества" и поймёте, какие глупости вы говорили.
дальнейшие нравоучения считаю бесполезными.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.07.2009, 20:29
Помогаю со студенческими работами здесь

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

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

Не меняются местами две переменные
Пытаюсь поменять местами две переменные через ассемблерные вставки. Почему нет результата? #include &lt;iostream&gt; using namespace...

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
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 - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru