УСЛОВНЫЙ ОПЕРАТОР
if(условие) оператор;
...продолжение...
Работает так:
Вычисляется условие.
Если оно истинно, то выполняется оператор, затем выполняется продолжение.
Если оно ложно, то сразу выполняется продолжение, а оператор не выполняется.
Если нам надо выполнить при истинности условия несколько операторов, мы должны заключить их в скобки {... } - это так называемый "составной оператор".
if(условие) { оператор1; оператор2; ... } продолжение
После } точка с запятой НЕ СТАВИТСЯ (можно и поставить, но не нужно).
Условный оператор изображают на схемах так:
| | | ---------------- ---| ЕСЛИ условие |---- | ---------------- | | | V V истинно ложно | | V | ------------ | | оператор | | ------------ | | | ------->-------<------- | | V продолжение |
Имеется вторая форма, с частью "иначе":
if(условие) оператор_если_истинно; else оператор_если_ложно;
"или то, или другое" (но не оба сразу)
| | | ---------------- ---| ЕСЛИ условие |----------- | ---------------- | | | V V истинно ложно | | V | ------------------------- ----------------------- | оператор_если_истинно | | оператор_если_ложно | ------------------------- ----------------------- | | ------->-------<-------------- | | V продолжение |
Пример1:
if(x > 10) printf("Икс больше десяти\n");
Пример2:
int x, y, z;
if(x < y) z = 1; else z = 2;
Условия:
В качестве условий могут использоваться операторы СРАВНЕНИЯ (сравнивать можно переменные, выражения, константы)
x < y меньше x > y больше x <= y меньше или равно x >= y больше или равно x == y равно x!= y не равно
Все эти операторы в качестве результата операции сравнения выдают 1, если сравнение истинно 0, если оно ложно.
Таким образом, на самом деле условный оператор работает так:
if(условие)....
Если условие есть НОЛЬ - то условие считается ложным. Если условие есть НЕ НОЛЬ а... -2, -1, 1, 2, 3,... - то условие истинно.
Это определение.
Из него в частности вытекает, что сравнение с целым нулем можно опускать:
if(x!= 0)...; сокращается до if(x)...; if(x == 0)...; сокращается до if(!x)...;
Пример:
int x, y, z;
if(x == 1){ y = 2; z = x + y; } else { y = 1; z = x - y; }
Пример со вложенными условными операторами:
if(x == 1){ printf("Икс равен 1\n"); if(y == 2){ printf("Игрек равен 2\n"); } } else { printf("Икс не равен 1\n"); }
Часто применяется последовательность условных операторов, перебирающая различные варианты:
if(x == 1) printf("Икс равен 1\n"); else if(x == 2) printf("Икс равен 2\n"); else if(x == 3){ printf("Икс равен 3\n"); y = 1; } else printf("Непредусмотренное значение икс\n");
Самое сложное - привыкнуть к тому, что сравнение обозначается знаком ==, а не = Знак = означает "присвоить значение", а не "сравнить на равенство".
ЦИКЛ while ("до тех пор, пока истинно")
while(условие) оператор; ...продолжение...
или
while(условие){ операторы; ... } ...продолжение...
| V | +------>--+ | | | V П | --------------------- о | | проверить УСЛОВИЕ |-------> если ложно (нуль) в A --------------------- | т | | | о | V | р | если истинно (не нуль) | и | | | т | V | ь | оператор V | | | | | | +-----<---+ | | +-------<---------------------+ | V продолжение
Пример: int x;
x = 10; while(x > 0){ printf("x=%d\n", x); x = x - 1; } printf("Конец.\n"); printf("x стало равно %d.\n", x); /* печатает 0 */
"Цикл" он потому, что его тело повторяется несколько раз.
Чтобы цикл окончился, оператор-тело цикла должен менять какую-то переменную, от которой зависит истинность условия повторений.
ОПЕРАТОРЫ "И, ИЛИ, НЕ"
Условия могут быть сложными.
ЕСЛИ красный И вес < 10 ТО...; ЕСЛИ красный ИЛИ синий ТО...; ЕСЛИ НЕ красный ТО...;
На языке Си такие условия записываются так:
if(условие1 && условие2)...; /* "И" */ if(условие1 || условие2)...; /* "ИЛИ" */ if(! условие1)...; /* "НЕ" */
Например:
if(4 < x && x <= 12)...;
Было бы неправильно записать
if(4 < x <= 12)...;
ибо язык программирования Си НЕ ПОНИМАЕТ двойное сравнение!
Еще примеры:
if(x < 3 || y > 4)...;
if(! (x < 3 || y > 4))...;
ЦИКЛ for ("для каждого")
Этот цикл является просто иной записью одного из вариантов цикла while. Он служит обычно для выполнения опеределенного действия несколько раз, не "пока истинно условие", а "выполнить N-раз".
У такого цикла есть "переменная цикла" или "счетчик повторений".
int i;
i = a; /* начальная инициализация */
while(i < b){
тело_цикла;
i += c; /* увеличение счетчика */ } ...продолжение...
переписывается в виде
int i;
for(i=a; i < b; i += c) тело_цикла;
тело_цикла будет выполнено для значений i a a+c a+c+c ...
пока i < b
В простейшем случае
for(i=1; i <= N; i++) printf("i=%d\n", i);
i означает "номер повторения".
Такой цикл служит для повторения СХОЖИХ действий НЕСКОЛЬКО раз с разным значением параметра.
ОПЕРАТОР break ("вывалиться из цикла")
Оператор break заставляет прервать выполнение тела цикла и сразу перейти к продолжению программы.
while(условие1){ операторы1;
if(условие2) break; ------->----+ | операторы2; | } | ...продолжение...<--------<---------+
и
for(i=0; условие1; i++){ операторы1;
if(условие2) break; ------->----+ | операторы2; | } | ...продолжение...<--------<---------+
Этот оператор позволяет организовывать дополнительные точки выхода из цикла (при дополнительных условиях).
Пример:
for(i=0; i < 20; i++){ printf("i=%d\n", i); if(i == 7){ printf("break loop!\n"); break; /* вывалиться из цикла */ } printf("more\n"); } printf("finished, i=%d\n", i); /* печатает 7 */
В частности, с его помощью можно организовывать бесконечный цикл:
for(;;){ /* заголовок бесконечного цикла */ операторы1;
if(условие2) break; ------->----+ | операторы2; | } | ...продолжение...<--------<---------+
Здесь в самом заголовке цикла НЕ ПРОВЕРЯЕТСЯ НИКАКИХ УСЛОВИЙ, такой цикл продолжается бесконечно. Условие продолжения считается всегда истинным.
Единственный способ выйти из него - это сделать break (при каком-то условии) в теле цикла, что и написано.
Бесконечный цикл можно также организовать при помощи while(1){ ... }
|