Язык Си - руководство для начинающих - M. УЭИТ
Шрифт:
Интервал:
Закладка:
Указаное вами значение stop - 897654 превышает ширину экрана.
Вот это да! У вас START больше, чем STOP.
Попробуйте, пожалуйста, еще раз.
ВЕЛИЧИНА START ДОЛЖНА БЫТЬ БОЛЬШЕ 0, ИНДЮК.
ОПЕРАЦИЯ УСЛОВИЯ: ?:
В языке Си имеется короткий способ записи одного из видов оператора if-else. Он называется "условным выражением" и использует операцию условия - ?:. Эта операция состоит из двух частей и содержит три операнда. Ниже приводится пример оператора с помощью которого находится абсолютное значение числа:
x = (y < 0 )? -y : y;
Все, что находится между знаком = и символом "точка с занятой" представляет собой условное выражение. Смысл этого оператора заключается в следующем: если у меньше 0, то х = - у; в противном случае х = у. В терминах оператора if-else данный оператор мог выглядеть так:
if(у < 0) x = (y < 0 )? -y : y;
х = -у;
else
х = у;
В общем виде условное выражение можно записать следующим образом:
выражение1 ? выражение2 : выражение3
Если выражение1 истинно (больше нуля), то значением всего условного выражения является величина выражения2;
если выражение1 ложно (равно 0), то значение всего условного выражения - величина выражения3.
Условное выражение удобно использовать в тех случаях, когда имеется некоторая переменная, которой можно присвоить одно из двух возможных значений. Типичным примером является присваивание переменной значения большей из двух величин:
mах = (а > b)? а : b;
Вообще говоря, использование условных выражений не являетcя обязательным, поскольку тех же результатов можно достичь при помощи операторов if-else. Однако условные выражения более компактны, и их применение обычно приводит к получению более компактного машинного кода.
Резюме: операция условия
I. Операция условия: ?:
В этой операции имеются три операнда, каждый из которых является выражением, причем вся запись выглядит следующим образом:
выражение1 ? выражение2 : выражение3.
Значение всего выражения равно величине выражения2, если выражение1 истинно, и величине выражения3 в противном случае.
II. ПРИМЕРЫ:
Выражение: (5 > 3) ? 1 : 2 имеет значение 1
Выражение: (3 > 5) ? 1 : 2 имеет значение 2
Выражение: (а > b) ? a : b имеет значение большей из величин а и b.
МНОЖЕСТВЕННЫЙ ВЫБОР: ОПЕРАТОРЫ switch И break
Операция условия и конструкция if-else облегчают написание программ, в которых осуществляется выбор между двумя вариантами. Однако иногда в программе необходимо произвести выбор одного из нескольких вариантов. Мы можем сделать это используя конструкцию if-else if - ... - else, но во многих случаях оказывается более удобным использовать оператор switch. Ниже приводится пример, иллюстрирующий его работу. Программа читает с терминала букву, затем выводит на печать название животного начинеющееся с этой буквы.
/*животные*/
main( )
{
char ch;
printf("Введите букву алфавита, а я укажу");
printf("название животного, n начинающееся с нее.n");
printf("Введите, пожалуйста, букву; для завершения работы введите #. n");
while((ch = getchar())!= '#')
{
if(ch != 'n') /* пропуск символа "новая строка" */
{ if(ch >= 'a' && ch <= 'я') /*разрешены только строчные буквы */
switch (ch)
{ case 'a' : printf(" аргали, дикий горный азиатский баранn");
break;
case 'б' : printf(" бабирусса, дикая малайская свинья n");
break;
case 'в' : printf(" выхухоль, водоплавающий крот n");
break;
case 'г' : printf(" гиббон, длиннорукая обезьяна n");
break;
case 'д' : printf(" дамандревесныйn");
break;
default: printf(" Это трудная задача!n");
break;
} else
printf(" Я распознаю только строчные буквы. n");
printf(" Введите, пожалуйста, следующую букву или #.n");
} /* конец if, пропускающего символ "новая строка" */
} /* конец цикла while */
}
РИС. 7.7. Программа, печатающая названия животных.
Нам стало скучно продолжать, и мы остановились на букве д. Давайте теперь рассмотрим один пример выполнения программы перед тем, как обсудить использованные в ней новые средства языка.
Введите букву алфавита, а я укажу название животного, начинающееся с нее.
Введите, пожалуйста, букву; для завершения работы введите #.
а [возврат]
аргали, дикий горный азиатский баран Введите, пожалуйста, следующую букву или #. г
[возврат]
гиббон, длиннорукая обезьяна Введите, пожалуйста, следующую букву или #. р
[возврат]
Это трудная задача!
Введите, пожалуйста, следующую букву или #. Т
[возврат]
Я распознаю только строчные буквы. Введите, пожалуйста, следующую букву или #. #
[возврат]
Этот пример служит иллюстрацией работы оператора swith. Вначале вычисляется выражение в скобках, расположенное за ключевым словом switch. В данном случае значением этого выражения будет символ, присвоенный переменной ch, который мы ввели перед этим. Затем программа просматривает список "меток" (в этом примере case 'a':, case'б': и т. д.) до тех пор, пока не находит "метку", которая соответствует данному значению. Далее программа переходит к выполнению оператора, расположенного в этой строке. Что произойдет в случае, когда такой подходящей строки не найдется? Если существует строка с "меткой" case default:, то будет выполняться оператор, помеченный этой меткой. В противном случае произойдет переход к оператору, расположенному за оператором switch.
Что можно сказать по поводу оператора break? Его выполнение приводит к тому, что в программе происходит выход из оператора switch и осуществляется переход к следующему за ним оператору (см. рис. 7.8). При отсутствии оператора break будут выполнены все операторы, начиная с помеченного данной меткой и завершая оператором switch. Если удалить все операторы break из нашей программы, то, указав, например, букву г, получим следующий диалог:
Введите букву алфавита, а я укажу название животного, начинающееся с нее.
Введите, пожалуйста, букву; для завершения работы введите #.
г [возврат]
гиббон, длиннорукая обезьяна
даман древесный
это трудная задача
Введите, пожалуйста, следующую букву или #.
# [возврат]
Мы видим, что выполнились все операторы, начиная от метки case 'г' и кончая оператором switch. Если вы знакомы с языком Паскаль, то можете заметить, что оператор switch в Си похож на оператор case в Паскале. Важнейшее отличие состоит в том, что если вы хотите, чтобы в каждом конкретном случае выполнялся только помеченный оператор, то в операторе switch необходимо использовать операторы break.
Метки, имеющиеся в операторе switch, должны быть константами или константными выражениями (выражения, операнды которого константы) целого типа (включая тип char). Запрещается использовать в качестве метки переменную. Значением выражения в скобках должна быть величина целого типа (опять же, включая тип char). Ниже приводится общая структура оператора switch:
switch(целоe выражение)
{ case константа1 : операторы; (необязательные)
case константа2 : операторы; (необязательные)
case default (необязательные) : операторы; (необязательные)
}
switch (number)
{
case 1: оператор1;