![]() |
|
Модераторы: bsa |
![]()
|
|
| nmn |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 593 Регистрация: 26.11.2005 Репутация: нет Всего: 1 |
получил различные значения переменной
чему же она должна быть равна? Присоединённый файл ( Кол-во скачиваний: 58 )
strange.PNG 72,43 Kb |
|||
|
||||
| Abyx |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 5 Всего: 10 |
забавно
|
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
||||
|
||||
| OlegSK |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 17.7.2010 Репутация: нет Всего: нет |
VS 2010 при попытке присвоить переменной b значение переменной A (именно A, а не ::A), ругается на переменную A, обзывая ее неоднозначной.
|
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
||||
|
||||
| OlegSK |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 17.7.2010 Репутация: нет Всего: нет |
Извените нуба, забыл задать вопрос... Хотел спросить: почему в этом случае возникает неоднозначность? Ведь это либо две разные переменные, либо переопределение одной и той же переменной...
|
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
потому что тогда он не знает к какой именно обратиться. первая переменная определена в анонимном пространстве имен, вторая в глобальном. В случае с ::a явно указывается, что поиск должен идти в глобальном пространстве имен. |
|||
|
||||
| OlegSK |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 17.7.2010 Репутация: нет Всего: нет |
azesmcar
Не понимаю, почему тогда при объявлении и инициализации переменной A в глобальном пространстве имен не возникает неоднозначности? Это сообщение отредактировал(а) OlegSK - 22.7.2010, 15:51 |
|||
|
||||
| Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 4 Всего: 39 |
собственно компилятор все правильно сделал
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
| OlegSK |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 17.7.2010 Репутация: нет Всего: нет |
azesmcar
Вот я и хочу понять, почему это правильно... То есть почему при объявлении и инициализации переменной A компилятор считает, что A и ::A - это одна и таже переменная (судя по тому как меняется значение переменной ::A), а при последующей попытке заюзать A компилятор уже не хочет считать, что A и ::A - это одна и таже переменная, и видит неоднозначность там где недавно (при объявлении A) ее не видел? И еще, если A и ::A - это две разные переменные, то как тогда адресоваться к переменной A чтобы не вызывать неоднозначности? Это сообщение отредактировал(а) OlegSK - 22.7.2010, 16:16 |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
||||
|
||||
| OlegSK |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 17.7.2010 Репутация: нет Всего: нет |
azesmcar
Как я понимаю, в результате получается две одноименные переменные (в противном случае, не может быть и речи ни о какой неоднозначности). Объясните мне: каким образом значение присваиваемое при объявлении и инициализации переменной A в глобальном пространстве имен вдруг загадочным образом оказывается присвоенным совсем другой переменной (пусть и одноименной) находящеся в анонимном пространстве имен? Может быть я туплю, но мне кажется, что в данном случае либо указанное при инициализации переменной A значение должно быть присвоенным именно ей, а ни как не переменной ::A, либо компилятор создав переменную в глобальном пространстве имен и обнаружив одноименную переменную в ананимном пространстве имен должен был уже на этом этапе (при присваевании указанного значения) пожаловаться на неоднозначность... Вообще, возникает нехорошее подозрение, что компилятор обрабатывает строку справа налево, сперва присваивая указанное при инициализации переменной A значение переменной ::A, и лишь затем создает переменную A... То есть казалось бы неделимая строка: int a = 12; раздергивается на две команды: a = 12; // идет обращение к переменной ::A int a; // создается переменная A Другими словами, компилятор поступает подобно некотрым журналюгам выдергивающим фразы из контекста, в итоге полностью извращая изначально сказанное, ставя все с ног на голову... З.Ы: Я конечно приму это к сведению, но все же хотелось бы если это возможно разобраться: почему так происходит. С другой стороны, это конечно можно списать на особенности работы компилятора и воспринимать как данность... Это сообщение отредактировал(а) OlegSK - 22.7.2010, 19:33 |
|||
|
||||
| OlegSK |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 17.7.2010 Репутация: нет Всего: нет |
Кстати, я и не знал, что значение константных переменных можно менять (без использования ссылок и указателей):
[code=cpp] namespace { const int a = 10; } int a = 5; // в результате константной переменной ::a будет присвоено значение 5... Это сообщение отредактировал(а) OlegSK - 22.7.2010, 19:58 |
|||
|
||||
| nmn |
|
||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 593 Регистрация: 26.11.2005 Репутация: нет Всего: 1 |
ммм
эквиавалентно
переменные в анонимном пространстве имен и глобальном пространстве имен пусть и с одинаковыми именами различны. Из за особенностей анонимного пространства имен после объявления переменной с таким же именем в глобальном пространстве имен, доступ к той что в анонимном пространстве имен пропадает |
||||||||
|
|||||||||
| OlegSK |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 17.7.2010 Репутация: нет Всего: нет |
А так вообще интересно:
Это сообщение отредактировал(а) OlegSK - 22.7.2010, 20:00 |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |