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

Поиск:

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


Эксперт
****


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

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



Всегда считал, что в C# при вот таком объявлении:
Код

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

область видимости i - внутри цикла.
Вот такая структура тоже работает вполне нормально:
Код

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

Но почему-то smile вот так делать нельзя:
Код

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

Пасиму? smile


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


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

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



так строка "int i = 0;"  сделает так, что во втором for'e уже будет не объявление переменной с областью видимости только внутри цикла, а будет редекларация "внешней" по отношению к циклу переменной.
И ошибка, скорее всего, звучит так: "redeclaring of variable i".

Добавлено через 1 минуту и 34 секунды
Цитата(Idsa @  17.4.2007,  16:24 Найти цитируемый пост)
Всегда считал, что в C# при вот таком объявлении:
Код

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


область видимости i - внутри цикла.

Ну, так у тебя в коде
Код

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

внутри цикла находятся только пустые строки 2 и 5. А строка с инициализацией(3) - вне обоих циклов. 
PM MAIL   Вверх
Void
Дата 17.4.2007, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


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

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



Нельзя перекрывать локальную переменную другой с таким же именем.
Код
class A
{
    int x;
    
    void foo()
    {
        int x; // OK
        {
            int x; // error
        }
    }
}

Точные правила надо смотреть в спецификации…


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


Эксперт
****


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

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



Прошу прощения: приведенный сначала нерабочий код неработает по вполне понятным причинам, а вот мне интересно, почему не работает вот это кусок:
Код

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


Это сообщение отредактировал(а) Idsa - 17.4.2007, 17:35


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


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


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

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



Ответ, вероятно, искать нужно в спецификации C#. Лично мне самому интересно, какая причина того что переменную цикла нельзя объявлять вне оператора for.


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


Эксперт
****


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

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



Цитата(mr.DUDA @  17.4.2007,  19:29 Найти цитируемый пост)
Ответ, вероятно, искать нужно в спецификации C#.


Ничего такого не вижу.
PM   Вверх
SLeN
Дата 18.4.2007, 00:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: 2
Всего: 4



Цитата(mr.DUDA @ 17.4.2007,  18:29)
 Лично мне самому интересно, какая причина того что переменную цикла нельзя объявлять вне оператора for.

Объявить то можно, только до цикла. 

Код

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


Прекрасно пройдет.

Но вот после объявления в for ее уже не объявить хотя и считается что ее нет в  области видимости

Код

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


Так компилятор ругается что она уже обвленна

Код


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


а так не верит в ее существование
прикольно  smile 
--------------------
Православные не проходите мимо! Люди нуждаются в вас
PM MAIL   Вверх
Retro
Дата 18.4.2007, 01:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Диалектик
***


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

Репутация: 9
Всего: 117



Цитата(Void @  17.4.2007,  16:32 Найти цитируемый пост)
Нельзя перекрывать локальную переменную другой с таким же именем.

Ага.

Цитата(mr.DUDA @  17.4.2007,  17:29 Найти цитируемый пост)
Ответ, вероятно, искать нужно в спецификации C#. Лично мне самому интересно, какая причина того что переменную цикла нельзя объявлять вне оператора for. 

Почему переменная цикла?
Насколько я помню, еще по Си, переменная объявленная в теле цикла является локальной переменной всей функции. Перекрыть локальную переменную можно такой же(с тем же именем) но объявленной глобально. Или в C# это не должно соблюдаться?

Это называется, если не изменяет память, - multiple declaration.




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


Un salsero
Group Icon


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

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



В Вижуал С++ такая же байда и это совсем не весело. Потому что на самом деле ничего не перекрывается. Одна переменная принадлежит одному циклу, другая другому, какое может быть пересечение?
gcc нормально обращается с этим, ява компилер тоже.


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


Диалектик
***


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

Репутация: 9
Всего: 117



Цитата(sergejzr @  18.4.2007,  00:20 Найти цитируемый пост)
Потому что на самом деле ничего не перекрывается.

Действительно, в БорландСи такое:
Код

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

компилится на ура.

А в студии(на C#) нифига, пишет - The name 'i' does not exist in the current context.

Что творится?

Добавлено через 1 минуту и 38 секунд
Рано я радовался, что C# так похож на С, нюансы, однако, прорисовываются. Будем учить.
PM MAIL   Вверх
Medved
Дата 18.4.2007, 01:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



MS учит программистов правилам хорошего кода.




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


Диалектик
***


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

Репутация: 9
Всего: 117



Код

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

Вот, ругается - 

Цитата

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


Добавлено через 3 минуты и 12 секунд
На хелп ошибки выдает:

Цитата

Error Message 
A local variable named 'var' cannot be declared in this scope because it would give a different meaning to 'var', which is already used in a 'parent or current/child' scope to denote something else


A variable declaration hides another declaration that would otherwise be in scope. Rename the variable that is declared on the line that generated CS0136. 

The following sample generates CS0136:

  Copy Code 
// CS0136.cs
namespace MyNamespace
{
   public class MyClass
   {
      public static void Main()
      {
         int i = 0;
         {
            char i = 'a';   // CS0136, hides int i
         }
         i++;
      }
   }
}

 

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


Эксперт
****


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

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



Цитата(sergejzr @  18.4.2007,  01:20 Найти цитируемый пост)
gcc нормально обращается с этим, ява компилер тоже.

Вот в Яве точно помню, что с этим проблем не было, а вот в C++ 3.1 (просто для примера smile ) переменная, объявленная в цикле, считается локальной для всего метода.

Чисто теоретически возможны 2 варианта: 1. переменная, объявленная в цикле, видима только в цикле 2. переменная, объявленная в цикле, видима во всем методе. C# же смешивает 2 эти варианта smile


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


Опытный
**


Профиль
Группа: Участник
Сообщений: 937
Регистрация: 3.12.2004
Где: Санкт-Петербург/П рага

Репутация: 7
Всего: 17



вот так отрабатывает корректно  smile 
Код

 private void Form1_Load(object sender, EventArgs e)
        {
            {
                for (int i = 0; i < 10; i++)
                    ;
            }
            {
                int i = 0;
                for (i = 0; i < 10; i++)
                    ;
            }
}


Это сообщение отредактировал(а) Wanderer2019 - 18.4.2007, 09:30
PM ICQ MSN   Вверх
sergejzr
Дата 18.4.2007, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


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

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



Цитата(Retro @  18.4.2007,  00:32 Найти цитируемый пост)
Рано я радовался, что C# так похож на С

Это скорее MS, а не разница C / C#

Цитата(Medved @  18.4.2007,  00:49 Найти цитируемый пост)
MS учит программистов правилам хорошего кода.

Не понимаю, что в этом случае хорошего smile

Цитата(Wanderer2019 @  18.4.2007,  08:29 Найти цитируемый пост)
вот так отрабатывает корректно

Спасибо! Наглядный пример, что задумано так, а реализовано эдак smile


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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