![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
Idsa |
|
||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 14 Всего: 62 |
Всегда считал, что в C# при вот таком объявлении:
область видимости i - внутри цикла. Вот такая структура тоже работает вполне нормально:
Но почему-то ![]()
Пасиму? ![]() |
||||||
|
|||||||
skyboy |
|
||||||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: нет Всего: 260 |
так строка "int i = 0;" сделает так, что во втором for'e уже будет не объявление переменной с областью видимости только внутри цикла, а будет редекларация "внешней" по отношению к циклу переменной.
И ошибка, скорее всего, звучит так: "redeclaring of variable i". Добавлено через 1 минуту и 34 секунды
Ну, так у тебя в коде
внутри цикла находятся только пустые строки 2 и 5. А строка с инициализацией(3) - вне обоих циклов. |
||||||
|
|||||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 25 Всего: 173 |
Нельзя перекрывать локальную переменную другой с таким же именем.
Точные правила надо смотреть в спецификации… -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
Idsa |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 14 Всего: 62 |
Прошу прощения: приведенный сначала нерабочий код неработает по вполне понятным причинам, а вот мне интересно, почему не работает вот это кусок:
Это сообщение отредактировал(а) Idsa - 17.4.2007, 17:35 |
|||
|
||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Ответ, вероятно, искать нужно в спецификации C#. Лично мне самому интересно, какая причина того что переменную цикла нельзя объявлять вне оператора for.
-------------------- ![]() |
|||
|
||||
Exception |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 4525 Регистрация: 26.12.2004 Репутация: 29 Всего: 186 |
||||
|
||||
SLeN |
|
||||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 137 Регистрация: 8.12.2006 Где: SPB Репутация: 2 Всего: 4 |
Объявить то можно, только до цикла.
Прекрасно пройдет. Но вот после объявления в for ее уже не объявить хотя и считается что ее нет в области видимости
Так компилятор ругается что она уже обвленна
а так не верит в ее существование прикольно ![]() --------------------
Православные не проходите мимо! Люди нуждаются в вас |
||||||||
|
|||||||||
Retro |
|
|||
![]() Диалектик ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1934 Регистрация: 28.6.2005 Где: Киев Репутация: 9 Всего: 117 |
Ага.
Почему переменная цикла? Насколько я помню, еще по Си, переменная объявленная в теле цикла является локальной переменной всей функции. Перекрыть локальную переменную можно такой же(с тем же именем) но объявленной глобально. Или в C# это не должно соблюдаться? Это называется, если не изменяет память, - multiple declaration. |
|||
|
||||
sergejzr |
|
|||
![]() Un salsero ![]() Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: нет Всего: 360 |
В Вижуал С++ такая же байда и это совсем не весело. Потому что на самом деле ничего не перекрывается. Одна переменная принадлежит одному циклу, другая другому, какое может быть пересечение?
gcc нормально обращается с этим, ява компилер тоже. |
|||
|
||||
Retro |
|
|||
![]() Диалектик ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1934 Регистрация: 28.6.2005 Где: Киев Репутация: 9 Всего: 117 |
Действительно, в БорландСи такое:
компилится на ура. А в студии(на C#) нифига, пишет - The name 'i' does not exist in the current context. Что творится? Добавлено через 1 минуту и 38 секунд Рано я радовался, что C# так похож на С, нюансы, однако, прорисовываются. Будем учить. |
|||
|
||||
Medved |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 7209 Регистрация: 15.9.2002 Где: Kazakhstan, Astan a Репутация: 3 Всего: 154 |
MS учит программистов правилам хорошего кода.
-------------------- |
|||
|
||||
Retro |
|
||||||
![]() Диалектик ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1934 Регистрация: 28.6.2005 Где: Киев Репутация: 9 Всего: 117 |
Вот, ругается -
Добавлено через 3 минуты и 12 секунд На хелп ошибки выдает:
|
||||||
|
|||||||
Idsa |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 14 Всего: 62 |
Вот в Яве точно помню, что с этим проблем не было, а вот в C++ 3.1 (просто для примера ![]() Чисто теоретически возможны 2 варианта: 1. переменная, объявленная в цикле, видима только в цикле 2. переменная, объявленная в цикле, видима во всем методе. C# же смешивает 2 эти варианта ![]() |
|||
|
||||
Wanderer2019 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 937 Регистрация: 3.12.2004 Где: Санкт-Петербург/П рага Репутация: 7 Всего: 17 |
вот так отрабатывает корректно
![]()
Это сообщение отредактировал(а) Wanderer2019 - 18.4.2007, 09:30 |
|||
|
||||
sergejzr |
|
|||
![]() Un salsero ![]() Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: нет Всего: 360 |
Это скорее MS, а не разница C / C# Не понимаю, что в этом случае хорошего ![]() Спасибо! Наглядный пример, что задумано так, а реализовано эдак ![]() |
|||
|
||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Что-то подсказывает мне, дело тут в "parent/child scope", по-видимому for открывает child scope уже начиная с объявления переменной цикла...
![]() -------------------- ![]() |
|||
|
||||
Naum |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 743 Регистрация: 7.9.2005 Где: Саратов, ул. Поса дского, 298 Репутация: 8 Всего: 15 |
Ессессно. А вы как думали? И вообще я не понимаю о чем вы спорите? Почему-то то, что конструкция вида
не компилится, никого не смущает. А стоило поменять while на for то уже начинаются распри. ![]() Это сообщение отредактировал(а) Naum - 18.4.2007, 13:09 -------------------- У нас всего два праздника Новый год и ТЯПница. |
||||
|
|||||
sergejzr |
|
|||
![]() Un salsero ![]() Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: нет Всего: 360 |
||||
|
||||
Naum |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 743 Регистрация: 7.9.2005 Где: Саратов, ул. Поса дского, 298 Репутация: 8 Всего: 15 |
sergejzr, скорее всего это сделано для компилятора. И очень полезно для программистов. Очень легко можно запутаться, если в разных скопах будут переменные с одинаковыми именами.
-------------------- У нас всего два праздника Новый год и ТЯПница. |
|||
|
||||
sergejzr |
|
|||
![]() Un salsero ![]() Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: нет Всего: 360 |
С другой стороны я часто пользуюсь переменной i в циклах (думаю не я один). Почему я должен выдумывать для каждого цикла новую переменную, или определять её в начале скопа? И то и другое - неудобно и не нужно.
|
|||
|
||||
Exception |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 4525 Регистрация: 26.12.2004 Репутация: 29 Всего: 186 |
||||
|
||||
sergejzr |
|
|||
![]() Un salsero ![]() Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: нет Всего: 360 |
В VC++ нет. Насчёт шарпа не знаю.
|
|||
|
||||
Naum |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 743 Регистрация: 7.9.2005 Где: Саратов, ул. Поса дского, 298 Репутация: 8 Всего: 15 |
Во-первых, в C# это скомпилируется.
Во-вторых, чем неудобно определять переменную в начале скопа, если она у тебя используется во многих циклах? Добавлено через 2 минуты и 53 секунды И еще... Больше двух последовательных циклов в одном методе не есть гуд. ;) -------------------- У нас всего два праздника Новый год и ТЯПница. |
|||
|
||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 25 Всего: 173 |
В VC++ 7.1 и новее — скомпилируется.
-------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
sergejzr |
|
||||
![]() Un salsero ![]() Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: нет Всего: 360 |
Хотя эта дискуссия для холиваров, но скажу. Такой код неудобно читать. Переменная, от которой ничего не зависит, выносится наверх вместе с "глобальными" этой функции. Просто лишнее отвлечение внимания.
Не есть гуд то кидаться в крайности и ещё не есть гуд впихивать в стандартные шаблоны нестандартные проблемы. Иногда нужно и несколько последовательных из за поставленной задачи, читаемости кода или чего нибудь ещё. |
||||
|
|||||
Medved |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 7209 Регистрация: 15.9.2002 Где: Kazakhstan, Astan a Репутация: 3 Всего: 154 |
То, что пытаются скомпилить - извращение. -------------------- |
|||
|
||||
Idsa |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 14 Всего: 62 |
Хм... мало того, что вот этот код не компилится:
, так и вот это не компилится:
Я совсем запутался ![]() |
||||
|
|||||
sergejzr |
|
|||
![]() Un salsero ![]() Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: нет Всего: 360 |
Idsa, это-от понятно. Переменная i определена только в цикле и не определена вне его.
|
|||
|
||||
Idsa |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 14 Всего: 62 |
Это было бы так, если не учитывать предыдущий пример. Получается, что первый кусок кода говорит, что переменная i уже объявлена в данном scope. Тогда мы во втором примере, учитывая это, пытаемся заюзать эту переменную... но нам говорят, что переменной нет в данном scope. |
|||
|
||||
Naum |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 743 Регистрация: 7.9.2005 Где: Саратов, ул. Поса дского, 298 Репутация: 8 Всего: 15 |
Читай внимательнее соообщения
Значит, что переменная объявлена не в этом скопе а в дочернем. Что запрещено. Нельзя объявлять переменную с одним и тем же именем в скопах находящихся на одной ветке вложенности. Нельзя и все. Так решили мс. sergejzr, теперь я скажу только за C#. Idsa, я так и не понимаю, если не будешь пользоваться переменной во внешнем скопе, нафига тебе объявлять ее во внешнем скопе. этот код запросто скомпилится в C#. Если же ты будешь использовать переменную во внешнем скопе, то объявление ее во внутреннем скопе может запросто тебя запутать.
Другой программист (да даже и ты дня через два) можешь не заметить, что в цикле ты объявляешь новую переменную (int такое маленькое слово ![]() З.Ы. (Опять же только для шарпистов). Подобный топик, ИМХО, похож на вопрос типа: "А почему программисты не используют goto?". Я свое ИМХО высказал. ![]() Это сообщение отредактировал(а) Naum - 19.4.2007, 10:15 -------------------- У нас всего два праздника Новый год и ТЯПница. |
||||
|
|||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |