Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015
- Название:Язык программирования C. Лекции и упражнения (6-е изд.) 2015
- Автор:
- Жанр:
- Издательство:Вильямс
- Год:0101
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015 краткое содержание
Язык программирования C. Лекции и упражнения (6-е изд.) 2015 - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
apples = (5+3) * (9+6);
Такая неопределенность оставлена в языке для того, чтобы разработчики компиляторов могли выбрать наиболее эффективный вариант для конкретной системы. Одним исключением из этого правила (или отсутствие правила) является обработка логических операций. В С гарантируется порядок вычисления логических выражений слева направо. Операции & & и || — это точки следования, так что все побочные эффекты происходят до перехода с одного операнда к другому. Более того, это гарантирует, что как только обнаруживается элемент, из-за которого все выражение становится ложным, вычисление прекращается. Такой подход делает возможным применение конструкций, подобных показанной ниже:
while ((с = getchar()) != ' ' && с != ‘\n'>
Здесь устанавливается цикл, который читает символы до появления символа пробела или новой строки. Первое подвыражение присваивает значение переменной с, которая затем используется во втором подвыражении. Не имея этой гарантии порядка, компьютер может попытаться вычислить значение второго подвыражения, прежде чем переменная с получит значение.
Вот еще один пример:
if (number != 0 && 12/number == 2)
printf("Значение переменной number равно 5 или 6.\n");
266 глава 7
Если переменная number имеет значение 0, то первое подвыражение ложно, и вычисление условного выражения дальше не продолжается. Это уберегает от переполнения, связанного с попыткой деления на ноль. Многие языки не обладают такой особенностью. Увидев, что значение переменной number равно 0, они все равно переходят к проверке следующего условия.
Наконец, рассмотрим такой пример:
while (х++ <10 && х + у < 20)
Тот факт, что операция && является точкой следования, служит гарантией того, что значение х будет инкрементировано до вычисления выражения справа.
Сводка: логические операции и выражения
Логические операции
В логических операциях в качестве операндов обычно выступают выражения отношений.
Операция ! принимает один операнд. Остальные операции выполняются над двумя операндами, один из которых находится слева от знака операции, другой — справа.
Логические выражения
Результат выражение1 && выражение2 истинный тогда и только тогда, когда истинны и
выражение 1, И выражение2. Результат выражение1 || выражение2 ИСТИННЫЙ, если ИСТИННО любое из выражений или оба. Результат ! выражение истинный, если выражение ложно, и наоборот.
Порядок вычисления
Логические выражения вычисляются слева направо. Вычисление прекращается, как только обнаруживается что-то, что делает ложным все выражение.
Примеры
6 > 2 && 3 == 3 — истинно.
! (6 > 2 && 3 == 3) — ЛОЖНО.
! = 0 && (20 / x) < 5 — второе подвыражение вычисляется, только если значение х является ненулевым.
Диапазон значений
Операция && позволяет проверять вхождение в диапазоны значений. Например, чтобы проверить, находится ли значение переменной score в диапазоне от 90 до 100, можно применить следующий оператор:
if (range >= 90 && range <= 100)
printf("Неплохой результат!\n");
Важно избегать имитации общей системы обозначений, принятой в математике, как показано в этом примере:
if (90 <= range <= 100) // Не поступайте так!
printf("Неплохой результат!\n");
Управляющие операторы С: ветвление и переходы 267
Проблема в том, что данный код содержит семантическую, а не синтаксическую ошибку, поэтому компилятор не сможет ее обнаружить (хотя может выдать предупреждающее сообщение). Поскольку для выполнения операции <= принят порядок слева направо, проверочное выражение интерпретируется так:
(90 <= range) <= 100
Подвыражение 90 <= range получает либо значение 1 (истина), либо 0 (ложь). И то, и другое значение меньше 100, поэтому все выражение всегда истинно вне зависимости от значения range. Таким образом, для проверки на вхождение в диапазон следует прим пользоваться операцией &&.
Во многих программах проверка вхождения в диапазон применяется для определения того, является ли символ, скажем, строчной буквой. Например, предположим, что переменная ch имеет тип char:
if (ch >= 'а' && ch <= 'z')
printf("Это строчная буква.\n");
Этот фрагмент работает для таких символьных кодов, как ASCII, в которых коды идущих друг за другом букв являются последовательно возрастающими числами. Тем не менее, он не будет работать с рядом других кодировок, включая EBCDIC. Более переносимый способ реализации такой проверки предполагает использование функции islower() из заголовочного файла ctype.h (см. табл. 7.1):
if (islower(ch))
printf("Это строчный символ.\n");
Функция islower() не зависит от применяемой кодировки символов. (Однако в некоторых устаревших реализациях семейство функций ctype.h отсутствует.)
Программа подсчета слов
Теперь вы располагаете всеми инструментами для написания программы подсчета слов (т.е. программы, которая читает входной текст и сообщает количество найденных в нем слов). Параллельно можно также подсчитывать символы и строки. Давайте посмотрим, что такая программа должна включать.
Во-первых, программа должна выполнять посимвольный ввод, а также иметь возможность узнавать, когда останавливаться. Во-вторых, она должна быть способна распознавать и подсчитывать такие элементы, как символы, строки и слова. Вот представление этой программы в виде псевдокода:
читать символ
пока еще имеются входные данные
инкрементировать счетчик символов
если строка прочитана, инкрементировать счетчик строк если слово прочитано, инкрементировать счетчик слов читать следующий символ
Вы уже имели дело с моделью цикла ввода:
while ((ch = getchar()) != STOP)
Здесь STOP представляет некоторое значение для ch, сигнализирующее о конце ввода. В примерах, рассмотренных до сих пор, для этой цели использовались символы новой строки и точки, однако ни один из них не подходит для универсальной про-
268 Глава 7 граммы подсчета слов. На данный момент выберем символ (такой как, например, |), который редко встречается в тексте. В главе 8 будет продемонстрировано более удачное решение, которое также позволит применять программу с текстовыми файлами и клавиатурным вводом.
Теперь приступим к рассмотрению тела цикла. Так как для ввода в программе используется функция getchar(), подсчет символов можно вести, инкрементируя счет чик при каждой итерации цикла. Для подсчета количества строк программа может проверять наличие символов новой строки. Если программа сталкивается с символом новой строки, она должна инкрементировать счетчик строк. Потребуется еще решить, что делать, если символ STOP встречается в середине строки. Должен ли он учитываться как строка? Один из ответов предполагает трактовку строки как неполной, т.е. строки, в которой содержатся различные символы, но нет символа конца строки. Этот случай можно идентифицировать, отслеживая предыдущий прочитанный символ. Если прочитанный символ, предшествующий STOP, не является символом новой строки, то вы имеете неполную строку.
Читать дальшеИнтервал:
Закладка: