И другие программные конструкции
Область действия переменных
Фізіологічна потреба дорослої людини у вітаміні С становить 60-100 мг на добу.
Мы уже знаем, что область действия переменных распространяется на блок кода, в котором они описаны, и на все блоки, непосредственно в него вложенные. Это также применимо и к другим типам блоков, например, к программным конструкциям, использующим ветвление и циклы. Рассмотрим следующую программу:
int i ;
for (i = 0; i < 10; i++)
{
string text = “Line” + Convert.ToString(i);
Console.WriteLine(“{0}”, text);
}
Console.WriteLine(“Last text output in loop: {0}”, text);
В данной программе строковая переменная text является локальной для цикла for. Такой код не пройдет компиляцию, поскольку в обращении к Console.WriteLine(), которое происходит вне этого цикла, делается попытка использовать переменную text, область действия которой не распространяется за пределы цикла. Изменим код следующим образом:
int i;
string text;
for (i = 0; i < 10; i++)
{
text = “Line” + Convert.ToString(i);
Console.WriteLine(“{0}”, text);
}
Console.WriteLine(“Last text output in loop: {0}”, text);
Этот код также недопустим. Причина кроется в том, что переменные должны и описываться, и инициализироваться до того, как они будут использоваться, а переменная text инициализируется только в цикле for. Значение, присвоенное переменной text, при выходе из цикла будет утрачено. Однако мы можем модифицировать код еще раз:
int i;
string text = “ ”;
for (i = 0; i < 10; i++)
{
text = “Line” + Convert.ToString(i);
Console.WriteLine(“{0}”, text);
}
Console.WriteLine(“Last text output in loop: {0}”, text);
На этот раз переменная text инициализирована вне цикла, и мы имеем доступ к ее значению. Результат выполнения видно на рисунке
|
В данном случае значение, присвоенное переменной text внутри цикла, оказывается доступным и вне его. Простое объявление переменной некоторого простого типа не влечет за собой выполнения каких-либо существенных действий. Только тогда, когда переменным присваиваются значения, для этих значений выделяется память, в которой они будут храниться. Когда такое выделение памяти происходит внутри цикла, это значение определяется как локальное и область его действия не выходит за пределы цикла. И хотя переменная не является локализованной внутри данного цикла, к ее значению это не относится. Напротив, присваивание переменной значения вне цикла дает гарантию того, что это значение локальное цмя всего основного кода и что область действия переменной распространяется в том числе и на цикл. Другими словами, мы будем оставаться внутри области действия переменной до тех пор, пока не покинем блок основного кода, поэтому возможность доступа к переменной имеется и за пределами цикла.
Лучше всего объявлять и инициализировать переменные перед теми блоками кода, в которых они используются. Исключением из этого правила могут быть переменные циклов, объявление которых является составной частью самого цикла. Например:
for ( int i = 0 ; i < 1 0 ; i + + )
{