Цикл заканчивается, когда условие перестает выполняться.
Цикл do имеет следующую структуру: do {
<код, выполняющийся в цикле> } while (<условие>);где в результате вычисления <условия> получается логическое значение.
Точка с запятой после оператора while является обязательной; весьма распространена ошибка, когда ее забывают. Мы можем использовать этот цикл, например, для того, чтобы вывести в столбец числа от 1 до 10:
int i = 1; | |
o | |
d
{
Console.WriteLine(“{0}”, i++); } while (i <= 10);В данном случае мы использовали оператор ++ в виде суффикса, который увеличивает значение i на единицу после его вывода на экран; поэтому необходимо выполнять проверку i <= 10, чтобы число 10 попало в набор выводимых чисел.
2.4.2.Цикл while
Цикл while очень похож на цикл do, однако у него имеется одно важное отличие: вычисление логического условия в цикле while происходит в начале цикла, а не в конце. Если в результате проверки условия будет получено значение false, то цикл while вообще не будет выполняться и управление передается коду, расположенному после этого цикла. Цикл while оформляется следующим образом:
while (<условие>) {
<код, выполняющийся в цикле> }Он может использоваться практически так же, как и цикл do. Например:
int i = 1; while (i <= 10) { | |
Console.WriteLine(“{0}”, i++); } |
Выполнение этого кода приведет к тому же результату: числа от 1 до 10 будут выведены в столбец.
2.4.3.Цикл for
Последний тип цикла - это цикл for. Он относится к тому типу циклов, которые выполняются заранее заданное количество раз и сами отвечают за организацию счетчика цикла. Для организации цикла for требуется следующая информация:
- начальное значение для инициализации переменной цикла;
- условие для продолжения выполнения цикла, зависящее от переменной цикла;
- операция, которая будет выполняться над переменной цикла по завершении очередного прохода цикла.
Например, если необходимо организовать цикл с переменной цикла, изменяющейся от 1 до 10 с шагом, равным единице, то в этом случае начальное значение равно 1, условием для продолжения цикла будет "переменная цикла меньше или равна 10", а операцией, выполняющейся по окончание каждого прохода цикла, будет прибавление значению переменной цикла единицы. Эта информация должна быть размещена в структуре цикла for следующим образом:
for (<инициализация>; <условие>; <операция>) <код, выполняющийся в цикле>Этот код работает так же, как и следующий цикл while
<инициализация>; while (<условие>)
<код, выполняющийся в цикле> <операция>
Однако формат цикла for оказывается более понятным, поскольку все необходимые параметры, определяющие цикл, собраны воедино, а не распределены по разным операторам
При рассмотрении циклов do и while приводился пример с выводом чисел от 1 до 10. Приведем код, позволяющий сделать то же самое с помощью цикла for
int i; | ||
for (i = 1; i <= 10; ++ i) | ||
Console. WriteLine (“{0}”, 1) |
;
Целой переменной цикла с именем i присваивается начальное значение 1, после чего она увеличивается на 1 в конце каждого прохода. В теле цикла происходит вывод значения i на консоль.
Обратите внимание, что когда начинает выполняться код, расположенный за циклом, переменная i обладает значением, равным 11. Дело в том, что в конце прохода цикла, в котором переменная i равняется 10, ее значение увеличивается на единицу до проверки условия i <= 10. Очевидно, что после проверки выполнение цикла прекращается.
Как и циклы while, циклы for выполняются только в том случае, если проверка условия дает true перед первым проходом цикла, т. е. код, находящийся внутри цикла, может вообще ни разу не выполняться
В заключение отметим, что у нас имеется возможность объявить переменную цикла в качестве составной части оператора for, для чего вышеприведенный пример следует переписать следующим образом
for (int i = 1; i <= 10; ++i)
Console.WriteLine("{0}", i) ; }В этом случае переменная i будет недоступна коду, находящемуся вне цикла.
2.4.4.Прекращение выполнения цикла
Иногда возникают ситуации, когда требуется более тонкий контроль за выполнением кода в цикле. В С# для этих целей предусмотрено четыре команды:
- break – приводит к немедленному завершению цикла.
- continue – приводит к немедленному завершению текущего прохода цикла (вычисления продолжаются со следующего прохода).
- goto – позволяет выйти из цикла в помеченную точку кода (этот метод не рекомендуется использовать, если вы хотите получить легко читаемый и понимаемый код).
- return – выводит из цикла и из функции, в которой он находится.
Команда break позволяет просто выйти из цикла, при этом управление передается на первую строку кода после цикла. Например:
int i = 1; while (i <= 10) { if (i = = 6) break;
Console.WriteLine(“{0}”, i++) ; }
Этот код выведет числа от 1 до 5, поскольку когда значение переменной i достигнет 6, команда break приведет к выходу из цикла.Команда continue прекращает выполнение текущего прохода цикла, а не всего цикла. Например: int i;
for (i = 1; i <= 10; i++)
{
if ((i % 2) = = 0) continue;
Console.WriteLine(i);}
Третий способ предполагает использование оператора goto. Например: int i = 1;
while (i <= 10)
{
if (i = = 6) goto exitPoint;
Console.WriteLine(“{0}”, i++) ; }
Console.WriteLine("Этот код никогда не будет выполняться!”); exitPoint:
Console.WriteLine('Этот код будет выполнен после того, как произойдет выход из цикла посредством goto.");
Выход из цикла посредством команды goto допустим (разве что несколько неряшлив), а вот использование goto для входа в цикл извне запрещено.
2.4.5.Бесконечные циклы
Возможно – в результате ошибки или преднамеренно – создать циклы, которые никогда не завершатся: так называемые бесконечные циклы. В качестве самого простого примера можно привести следующий цикл'
while (true) {
// код, выполняющийся в цикле }Иногда такой цикл бывает полезен, тем более что из него всегда можно выйти, например, с помощью оператора break.
Однако в тех случаях, когда создание бесконечного цикла происходит по недосмотру, последствия могут оказаться очень неприятными. Рассмотрим следующий цикл, который очень напоминает цикл for из предыдущего раздела:
int i = 1;
while (i <= 10)
{
if ((i % 2) = = 0)
continue;
Console.WriteLine(“{0}”, i++); }Здесь увеличение переменной цикла i происходит в последней строке цикла, т. е. после оператора continue. Поэтому если управление передается на оператор continue (а это произойдет, когда переменная i станет равной 2), следующая итерация будет исполняться с тем же значением переменной i, опять пройдет проверка текущего значения 1, начнет выполняться итерация и т. д. Это приведет к зависанию приложения. Обратите внимание, что в этом случае существует возможность выйти из зависшего приложения обычным способом, поэтому не придется перезагружать компьютер. 2.5. Вопросы для повторения
1. Что такое ветвление?
2. Что такое булева логика?
3. Логические операторы сравнения.
4. Опереторы, используемые для работы с логическими переменными.
5. Операторы работы с битами.
6. Старшинство операторов.
7. Оператор if-else.
8. Оператор switch.
9. Организация циклов.
10. Цикл while, while-do, do-while.
11. Цикл for.
В языке C# существуют еще несколько типов переменных:
-перечислимый тип – тип переменных, которые принимают дискретные значения из множества, определяемого пользователем, и которые могут нести дополнительную смысловую нагрузку.
-структуры – сложные типы переменных, которые создаются
-из определяемого пользователем набора других типов переменных.
-массивы – это тип, который содержит большое количество переменных одного и того же типа и который позволяет осуществлять индексный доступ к отдельным значениям.
Преобразование типов описывает преобразование значений одного типа в значения другого типа.
3.1.Преобразованиепеременных из одного типа в другой
Любые данные, независимо от своего типа, представляют собой последовательность двоичных битов, т. е. последовательность, состоящую из нулей и единиц. Собственно значение переменной зависит от того, каким образом эти биты интерпретируются. Простейшим примером такого подхода может служить тип char, который содержит номер символа из множества символов Unicode. Этот номер хранится абсолютно так же, как и число типа ushort: в обоих случаях это число, лежащее в диапазоне от 0 до 65 535.
Однако в большинстве случаев оказывается, что для различных типов переменных используются разные способы представления данных. Отсюда следует, что даже в тех ситуациях, когда имеется физическая возможность перенести последовательность битов из одной переменной в переменную какого-либо другого типа (например, обеим переменным для хранения требуется одинаковая область памяти, или у той переменной, в которую осуществляется запись, оказывается достаточно места для размещения всех исходных битов), результаты могут совершенно не совпадать с теми, которые ожидали.
Вместо такой переписи битов из одной переменной в другую приходится использовать преобразования типов данных.
Существует два вида преобразования типов.
Неявное преобразование – когда преобразование типа А в тип В возможно при любых обстоятельствах, а правила проведения такого преобразования достаточно просты, чтобы доверить его компилятору.