$ vim words.c
#include <stdio.h>
#define IN 1 /* внутри слова */
#define OUT 0 /* вне слова */
int main(void)
{
int c, nl, nw, nc, state;
state = OUT;
c = nl = nw = nc = 0;
while ((c = getchar()) != EOF)
{
++nc; /* новый символ */
if (c == '\n')
++nl; /* новая строка */
if (c == ' ' || c == '\n' || c == '\t')
state = OUT; /* конец слова */
else if (state == OUT)
{
state = IN;
++nw; /* новое слово */
}
}
printf("Строк: %d\nСлов: %d\nСимволов: %d\n", nl, nw, nc);
return 0;
}
$ cc -g -O0 -Wall -o a.out words.c
$ ./a.outHello, my friend!
How are you?
<Ctrl>+<D>
Строк: 2
Слов: 6
Символов: 31
Строка
nl = nw = nc = 0;
устанавливает все три переменные в нуль. Такая запись не является какой-то особой конструкцией и допустима потому, что присваивание есть выражение со своим собственным значением, а операции присваивания выполняются справа налево. Указанная строка эквивалентна
nl = (nw = (nc = 0));
Оператор || означает ИЛИ, так что строка
if (с == ' ' || с == '\n' || с == '\t')
читается как "если с есть пробел, или с есть новая строка, или с есть табуляция". Существует также оператор &&, означающий И. Его приоритет выше, чем приоритет ||. Выражения, связанные операторами && или ||, вычисляются слева направо; при этом гарантируется, что вычисления сразу прервутся, как только будет установлена истинность или ложность условия. Если c есть пробел, то дальше проверять, является значение с символом новой строки или же табуляции, не нужно.
Слово else указывает на альтернативные действия, выполняемые в случае, когда условие, указанное в if, не является истинным. В общем виде условная инструкция записывается так:
if (выражение)инструкция1elseинструкция2
В конструкции if-else выполняется одна и только одна из двух инструкций. Если выражение истинно, то выполняется инструкция1, если нет, то инструкция2. Каждая из этих двух инструкций представляет собой либо одну инструкцию, либо несколько, заключенных в фигурные скобки.
Комментариев нет:
Отправить комментарий