while (
Оформляя ее в виде программы ни Си, получим
#include ‹stdio.h›
/* копирование ввода на вывод, 1-я версия */
main
{
int c;
c = getchar;
while (c != EOF) {
putchar(c);
c = getchar;
}
}
Оператор отношения != означает "не равно".
Каждый символ, вводимый с клавиатуры или появляющийся на экране, как и любой другой символ внутри машины, кодируется комбинацией битов. Тип char специально предназначен для хранения символьных данных, однако для этого также годится и любой целый тип. Мы пользуемся типом int и делаем это по одной важной причине, которая требует разъяснений.
Существует проблема: как отличить конец ввода от обычных читаемых данных. Решение заключается в том, чтобы функция
EOF - целая константа, определенная в ‹stdio.h›. Какое значение имеет эта константа - неважно, лишь бы оно отличалось от любого из возможных значений типа
Программу копирования можно написать более сжато. В Си любое присваивание, например
c = getchar
трактуется как выражение со значением, равным значению левой части после присваивания. Это значит, что присваивание может встречаться внутри более сложного выражения. Если присваивание переменной
#include ‹stdio.h›
/* копирование ввода на вывод; 2-я версия */
main
{
int c;
while ((с = getchar) != EOF)
putchar(c);
}
Цикл
В данной версии ввод "централизован". - в программе имеется только одно обращение к
Скобки внутри условия, вокруг присваивания, необходимы.
c = getchar != EOF
эквивалентна записи
c = (getchar != EOF)
А это совсем не то, что нам нужно: переменной
Упражнение 1.6. Убедитесь в том, что выражение
Упражнение 1.7. Напишите программу, печатающую значение
1.5.2 Подсчет символов
Следующая программа занимается подсчетом символов; она имеет много сходных черт с программой копирования.
#include ‹stdio.h›
/* подсчет вводимых символов; 1-я версия */
main
{
long nc;
nc = 0;
while (getchar != EOF)
++nc;
printf("%ld\n", nc);
}
Инструкция
++nc;
представляет новый оператор ++, который означает