Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нюанс с использованием for, Я в шоке! :shok 
:(
    Опции темы
mr.DUDA
Дата 18.4.2007, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Что-то подсказывает мне, дело тут в "parent/child scope", по-видимому for открывает child scope уже начиная с объявления переменной цикла...  smile 


--------------------
user posted image
PM MAIL WWW   Вверх
Naum
Дата 18.4.2007, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 743
Регистрация: 7.9.2005
Где: Саратов, ул. Поса дского, 298

Репутация: 8
Всего: 15



Цитата(mr.DUDA @  18.4.2007,  10:48 Найти цитируемый пост)
по-видимому for открывает child scope уже начиная с объявления переменной цикла...

Ессессно. А вы как думали? И вообще я не понимаю о чем вы спорите?
Почему-то то, что конструкция вида
Код

{
   int i;
   while (i < 10)
   {
       i++;
   }
}
int i;

не компилится, никого не смущает. А стоило поменять while на for то уже начинаются распри.  smile 

Это сообщение отредактировал(а) Naum - 18.4.2007, 13:09


--------------------
У нас всего два праздника Новый год и ТЯПница.
PM MAIL ICQ   Вверх
sergejzr
Дата 18.4.2007, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: нет
Всего: 360



Цитата(Naum @  18.4.2007,  12:03 Найти цитируемый пост)
не компилится, никого не смущает

почему ты так думаешь?


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Naum
Дата 18.4.2007, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 743
Регистрация: 7.9.2005
Где: Саратов, ул. Поса дского, 298

Репутация: 8
Всего: 15



sergejzr, скорее всего это сделано для компилятора. И очень полезно для программистов. Очень легко можно запутаться, если в разных скопах будут переменные с одинаковыми именами.


--------------------
У нас всего два праздника Новый год и ТЯПница.
PM MAIL ICQ   Вверх
sergejzr
Дата 18.4.2007, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: нет
Всего: 360



С другой стороны я часто пользуюсь переменной i в циклах (думаю не я один). Почему я должен выдумывать для каждого цикла новую переменную, или определять её в начале скопа? И то и другое - неудобно и не нужно.


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Exception
Дата 18.4.2007, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 29
Всего: 186



Цитата(sergejzr @  18.4.2007,  15:44 Найти цитируемый пост)
очему я должен выдумывать для каждого цикла новую переменную


Так разве

Код
for (int i = 0; i < 5; i++);
for (int i = 0; i < 5; i++);


не скомплируется?
PM   Вверх
sergejzr
Дата 18.4.2007, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: нет
Всего: 360



В VC++ нет. Насчёт шарпа не знаю.


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Naum
Дата 18.4.2007, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 743
Регистрация: 7.9.2005
Где: Саратов, ул. Поса дского, 298

Репутация: 8
Всего: 15



Во-первых, в C# это скомпилируется.
Во-вторых, чем неудобно определять переменную в начале скопа, если она у тебя используется во многих циклах?

Добавлено через 2 минуты и 53 секунды
И еще... Больше двух последовательных циклов в одном методе не есть гуд. ;)


--------------------
У нас всего два праздника Новый год и ТЯПница.
PM MAIL ICQ   Вверх
Void
Дата 18.4.2007, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 25
Всего: 173



Цитата(sergejzr @  18.4.2007,  17:59 Найти цитируемый пост)
В VC++ нет. Насчёт шарпа не знаю. 

В VC++ 7.1 и новее — скомпилируется.
Код
int main()
{    
    int i;
    for (int i = 0; i < 10; ++i) // всё нормально
        ;
    for (int i = 0; i < 10; ++i) // и снова ничего противозаконного
        ;
    // А вот это уже было бы ошибкой из-за объявления в первой строке
    // int i;
}



--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
sergejzr
Дата 18.4.2007, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: нет
Всего: 360



Цитата(Naum @  18.4.2007,  15:21 Найти цитируемый пост)
Во-вторых, чем неудобно определять переменную в начале скопа, если она у тебя используется во многих циклах?

Хотя эта дискуссия для холиваров, но скажу. Такой код неудобно читать. Переменная, от которой ничего не зависит, выносится наверх вместе с "глобальными" этой функции. Просто лишнее отвлечение внимания.


Цитата(Naum @  18.4.2007,  15:21 Найти цитируемый пост)
И еще... Больше двух последовательных циклов в одном методе не есть гуд. ;)

Не есть гуд то кидаться в крайности и  ещё не есть гуд впихивать в стандартные шаблоны нестандартные проблемы. Иногда нужно и несколько последовательных из за поставленной задачи, читаемости кода или чего нибудь ещё.


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Medved
Дата 18.4.2007, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 3
Всего: 154



Цитата(sergejzr @  18.4.2007,  12:44 Найти цитируемый пост)
Не понимаю, что в этом случае хорошего 

То, что пытаются скомпилить - извращение. 




--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
Idsa
Дата 19.4.2007, 07:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 14
Всего: 62



Хм... мало того, что вот этот код не компилится:
Код

      for (int i = 0; i < 10; i++)
        ;
      int i;

, так и вот это не компилится:
Код

      for (int i = 0; i < 10; i++)
        ;
      Console.WriteLine(i);

Я совсем запутался smile


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
sergejzr
Дата 19.4.2007, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: нет
Всего: 360



Idsa, это-от понятно. Переменная i определена только в цикле и не определена вне его.


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Idsa
Дата 19.4.2007, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 14
Всего: 62



Цитата(sergejzr @  19.4.2007,  09:39 Найти цитируемый пост)
Idsa, это-от понятно. Переменная i определена только в цикле и не определена вне его.

Это было бы так, если не учитывать предыдущий пример. Получается, что первый кусок кода говорит, что переменная i уже объявлена в данном scope. Тогда мы во втором примере, учитывая это, пытаемся заюзать эту переменную... но нам говорят, что переменной нет в данном scope.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Naum
Дата 19.4.2007, 10:10 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 743
Регистрация: 7.9.2005
Где: Саратов, ул. Поса дского, 298

Репутация: 8
Всего: 15



Цитата(Idsa @  19.4.2007,  10:50 Найти цитируемый пост)
что переменная i уже объявлена в данном scope.

Читай внимательнее соообщения
Цитата

Error    1    A local variable named 'i' cannot be declared in this scope because it would give a different meaning to 'i', which is already used in a 'child' scope to denote something else

Значит, что переменная объявлена не в этом скопе а в дочернем. Что запрещено.
Нельзя объявлять переменную с одним и тем же именем в скопах находящихся на одной ветке вложенности. Нельзя и все. Так решили мс.
sergejzr, теперь я скажу только за C#.
Idsa, я так и не понимаю, если не будешь пользоваться переменной во внешнем скопе, нафига тебе объявлять ее во внешнем скопе.
Цитата(Exception @  18.4.2007,  16:52 Найти цитируемый пост)
for (int i = 0; i < 5; i++);
for (int i = 0; i < 5; i++);

этот код запросто скомпилится в C#.

Если же ты будешь использовать переменную во внешнем скопе, то объявление ее во внутреннем скопе может запросто тебя запутать.
Код

int i = 0;
for (int i = 0; i < 10; i++)
{
   DoSomething();
}
AnyMethod(i);

Другой программист (да даже и ты дня через два) можешь не заметить, что в цикле ты объявляешь новую переменную (int такое маленькое слово smile). И какое значение у тебя передается AnyMethod? 0 или 10?
З.Ы. (Опять же только для шарпистов). 
Подобный топик, ИМХО, похож на вопрос типа: "А почему программисты не используют goto?".
Я свое ИМХО высказал.  smile Больше писать в этот топик не буду.

Это сообщение отредактировал(а) Naum - 19.4.2007, 10:15


--------------------
У нас всего два праздника Новый год и ТЯПница.
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0720 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.