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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Область видимости переменной, объявленной в цикле. 
V
    Опции темы
ajunta
Дата 14.7.2008, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Доброго времени суток!

Объйсните, пожалуйста, следующую ситуацию. Имеется код:

Код

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


У него в цикле объйвлена перменная i, предположим хочу обратиться к ней после цикла:

Код

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

            Console.WriteLine(i.ToString());           
 
            Console.ReadKey();


это приводит к ошибке:

Код

Error    1    The name 'i' does not exist in the current context


Далее рассуждаю так, что раз переменной в этой точке не существует, то ее можно там создать:


Код

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

            int i = 0;

            Console.WriteLine(i.ToString());           
 
            Console.ReadKey();


Однако это приводит к другой ошибке:

Код

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


Собственно не понятно, какова же область видимости и .. существования что ли.. переменной, которая объявлена указанным образом.

Это сообщение отредактировал(а) ajunta - 14.7.2008, 08:33
PM MAIL   Вверх
mihryak
Дата 14.7.2008, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 19
Всего: 36



синтаксически можно сделать так
Код

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

i будет рано 10 после цикла

но не принято использовать итератор цикла for после его завершения, лучше переделай цикл в while или do-while

пс. компилятор delphi, например, в режиме оптимизации мог обратить цикл так, что после выхода i будет равно -1, т.е. в этом языке значение итератора после цикла вообще недетерминировано
PM MAIL ICQ   Вверх
kemiisto
Дата 14.7.2008, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



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

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



Переменная-счетчик цикла, объявленная таким образом:
Код

for (int i = 0; i < 10; i++)
            {
                // тело цикла
            }
 
доступна только в теле цикла. Попытка обратиться вне тела приводить к ошибке. А если попытаться объявить еще раз переменную с тем же именем, то ктмпилятор ругается, что в дочерней области видимости уже есть такая переменная.

Цитата(ajunta @  14.7.2008,  09:33 Найти цитируемый пост)
предположим хочу обратиться к ней после цикла:

Объявите её до цикла:
Код

int i;
for (i = 0; i < 10; i++)
            {
                // тело цикла
            }
// тут i по-прежнему доступна


Это сообщение отредактировал(а) kemiisto - 14.7.2008, 09:11


--------------------
PM MAIL WWW GTalk Jabber   Вверх
amarenkov
Дата 14.7.2008, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Тут просто надо различать область существования переменной и область ее "смысловой" видимости. Существует i, в вашем случае, только внутри цикла. Но предупредительный компилятор не дает вам создать такую же переменную после цикла, чтобы вы же не запутались в смысле этой переменной smile.
PM MAIL ICQ   Вверх
ajunta
Дата 14.7.2008, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ну про то, что ее можно объявить перед циклом это понятно.

Цитата

Но предупредительный компилятор не дает вам создать такую же переменную после цикла, чтобы вы же не запутались в смысле этой переменной


Ах вот зачем это сделано...


Хотя использовать ее второй раз, но опять в цикле - можно:

Код

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

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


видимо логика разработчиков состояла в том, что бы строго выделить переменные "из циклов".
PM MAIL   Вверх
Idsa
Дата 14.7.2008, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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





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


Новичок



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

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



Спасибо!
PM MAIL   Вверх
PashaPash
Дата 15.7.2008, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 13
Всего: 49



ajunta, C# Language Specification
8.5.1 Local variable declarations (http://msdn.microsoft.com/en-us/library/aa664742(VS.71).aspx): The scope of a local variable declared in a local-variable-declaration is the block in which the declaration occurs. It is an error to refer to a local variable in a textual position that precedes the local-variable-declarator of the local variable.
Т.е. даже если переменная объявлена где-то в конце блока, область видимости ее - весь блок. Просто компилятор не дает тебе ее исползовать до текстового объявления.

Это сообщение отредактировал(а) PashaPash - 15.7.2008, 09:32


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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