Страница 53 из 69
Обратите внимание, что мы использовали массив символов (char
name [30];), вместо указателя на символ (char *name;). Почему?
Причиной этого служит тот факт, что объявление массива на самом
деле резервирует память для хранения его элементов, а при объяв-
лении ссылки этого не происходит. Если бы мы использовали объяв-
ление char *name, тогда нам бы пришлось явным образом резервиро-
вать память для хранения переменной *name.
Использование gets и getch для ввода
------------------------------------
Использование scanf, однако, порождает другую проблему. Сно-
- 435,436 -
ва выполните программу, но теперь введите ваше имя и фамилию. За-
метьте, что программа использует в своем ответе только имя. Поче-
му? Потому, что введенный вами после имени пробел сигнализирует
scanf о конце вводимой строки.
Возможны два способа решения этой проблемы. Вот первый из
них:
#include
main ()
{
float a,b,ratio;
printf("Введите два числа: ");
- 439,440 -
scanf("%f %f",&a,&b);
if (b == 0.0)
printf("Отношение не определено\n");
else {
ratio= a / b;
printf("Отношение = %f \n",ratio);
}
}
Оператор, находящийся в двух следующих за оператором scanf
строках, известен как условный оператор if. Вы можете понимать
его так:"Если значение выражения (b == 0.0) истинно, сразу выз-
вать printf. Если значение выражения ложно, присвоить a/b пере-
менной ratio, затем вызвать printf."
Теперь, если вы введете 0 в качестве второго значения, то
ваша программа напечатает сообщение
Отношение не определено
и будет ожидать от вас нажатия любой клавиши для возврата в Турбо
Си. Если второе значение - ненулевое, то программа вычисляет и
печатает ratio, а затем ожидает нажатия клавиши - и все это бла-
годаря магии оператора if.
Логические операции
-----------------------------------------------------------------
Имеется также три логические операции: И (&&), ИЛИ (||) и НЕ
(!). Их не следует путать с описанными выше битовыми операциями
(&,|,~). Логические операции работают с логическими значениями
(истина или ложь) и позволяют составлять логические выражения.
Как же их отличать от соответствующих битовых операций?
- Эти логические операторы всегда дают в результате значение
либо 0 (ложь), либо 1 (истина), в то время как поразрядные опера-
торы выполняются путем последовательной обработки цепочки битов
до тех пор, пока не станет ясен результат.
- Логические операторы && и !! известны как операторы типа
"short circuit". Выполнение операторов такого типа прекращается
- 441,442 -
как только становится ясно, будет ли результат иметь значение ис-
тина или ложь. Предположим, что вы имеете выражение вида:
exp1 && exp2
Если exp1 - ложь, значит и все выражение ложь. Таким обра-
зом, exp2 никогда не будет вычисляться. Аналогично, если мы имеем
выражение вида
exp1 !! exp2
то exp2 никогда не будет вычисляться, если exp1 верно.
Дополнительные сведения о выражениях.
-----------------------------------------------------------------
Прежде чем перейти к обсуждению операторов цикла, мы дадим
некоторые комментарии к использованию выражений. Такие выражения,
как (b == 0.0) и (a <= q*r) довольно привлекательны по своей кра-
соте. Однако Си допускает написание более сложных и запутанных
конструкций, чем эти.
Операторы присваивания.
-----------------------------------------------------------------
Любой оператор присваивания, заключенный в круглые скобки,
является выражением с определенным значением, которое получается
в реэультате этого присваивания.
Например, выражение (sum = 5+3) имеет значение 8, поэтому
выражение ((sum = 5+3) <= 10) будет всегда иметь значение "исти-
на" (т.к. 8 <= 10). Более экзотичен следующий пример:
if ((ch=getch()) == 'q')
puts("До свидания! Программа завершена.\n");