Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Керниган, Ричи. Язык C.docx
Скачиваний:
5
Добавлен:
05.05.2019
Размер:
377.71 Кб
Скачать

* 1. Учебное введение *

Давайте начнем с быстрого введения в язык "C". Наша

цель - продемонстрировать существенные элементы языка на ре-

альных программах, не увязая при этом в деталях, формальных

правилах и исключениях. В этой главе мы не пытаемся изложить

язык полностью или хотя бы строго (разумеется, приводимые

примеры будут корректными). Мы хотим как можно скорее довес-

ти вас до такого уровня, на котором вы были бы в состоянии

писать полезные программы, и чтобы добиться этого, мы сосре-

дотачиваемся на основном: переменных и константах, арифмети-

ке, операторах передачи управления, функциях и элементарных

сведениях о вводе и выводе. Мы совершенно намеренно оставля-

ем за пределами этой главы многие элементы языка "C", кото-

рые имеют первостепенное значение при написании больших

программ, в том числе указатели, сртуктуры, большую часть из

богатого набора операторов языка "C", несколько операторов

передачи управления и несметное количество деталей.

Такой подход имеет, конечно, свои недостатки. Самым су-

щественным является то, что полное описание любого конкрет-

ного элемента языка не излагается в одном месте, а поясне-

ния, в силу краткости, могут привести к неправильному истол-

кованию. Кроме того, из-за невозможности использовать всю

мощь языка, примеры оказываются не столь краткими и элегант-

ными, как они могли бы быть. И хотя мы старались свести эти

недостатки к минимуму, все же имейте их ввиду.

Другой недостаток состоит в том, что последующие главы

будут неизбежно повторять некоторые части этой главы. Мы на-

деемся, что такое повторение будет скорее помогать, чем раз-

дражать.

Во всяком случае, опытные программисты должны оказаться

в состоянии проэкстраполировать материал данной главы на

свои собственные программистские нужды. Начинающие же должны

в дополнение писать аналогичные маленькие самостоятельные

программы. И те, и другие могут использовать эту главу как

каркас, на который будут навешиваться более подробные описа-

ния, начинающиеся с главы 2.

1.1. Hачинаем

Единственный способ освоить новый язык

программирования - писать на нем программы. Первая програм-

ма, которая должна быть написана, - одна для всех языков:

напечатать слова : HELLO, WORLD.

Это - самый существенный барьер; чтобы преодолеть его,

вы должны суметь завести где-то текст программы, успешно его

скомпилировать, загрузить, прогнать и найти, где оказалась

ваша выдача. Если вы научились справляться с этими техничес-

кими деталями, все остальное сравнительно просто.

Программа печати "HELLO, WORLD" на языке "C" имеет вид:

MAIN ()

{

PRINTF("HELLO, WORLD\N");

}

Как пропустить эту программу - зависит от используемой

вами системы. В частности, на операционной системе "UNIX" вы

должны завести исходную программу в файле, имя которого

оканчивается на ".C" , например, HELLO.C , и затем скомпили-

ровать ее по команде

CC HELLO.C

Если вы не допустили какой-либо небрежности , такой как

пропуск символа или неправильное написание, компиляция прой-

дет без сообщений и будет создан исполняемый файл с именем

а.OUT . Прогон его по команде

A.OUT

приведет к выводу

HELLO, WORLD

На других системах эти правила будут иными; проконсуль-

тируйтесь с местным авторитетом.

Упражнение 1-1

---------------

Пропустите эту программу на вашей системе. Попробуйте

не включать различные части программы и посмотрите какие со-

общения об ошибках вы при этом получите.

Теперь некоторые пояснения к самой программе. Любая

"C"-программа, каков бы ни был ее размер, состоит из одной

или более "функций", указывающих фактические операции

компьютера, которые должны быть выполнены. Функции в языке

"C" подобны функциям и подпрограммам фортрана и процедурам

PL/1, паскаля и т.д. В нашем примере такой функцией является

MAIN. Обычно вы можете давать функциям любые имена по вашему

усмотрению, но MAIN - это особое имя; выполнение вашей прог-

раммы начинается сначала с функции MAIN. Это означает, что

каждая программа должна в каком-то месте содержать функцию с

именем MAIN. Для выполнения определенных действий функция

MAIN обычно обращается к другим функциям, часть из которых

находится в той же самой программе, а часть - в библиотеках,

содержащих ранее написанные функции.

Одним способом обмена данными между функциями является

передача посредством аргументов. Круглые скобки, следующие

за именем функции, заключают в себе список аргументов; здесь

маIN - функция без аргументов, что указывается как (). Опе-

раторы, составляющие функцию, заключаются в фигурные скобки

{ и }, которые аналогичны DO-END в PL/1 или BEGIN-END в ал-

голе, паскале и т.д. Обращение к функции осуществляется ука-

занием ее имени, за которым следует заключенный в круглые

скобки список аргументов. здесь нет никаких операторов CALL,

как в фортране или PL/1. Круглые скобки должны присутство-

вать и в том случае, когда функция не имеет аргументов.

Строка

PRINTF("HELLO, WORLD\N");

является обращением к функции, которое вызывает функцию

с именем PRINTF и аргуметом "HELLO, WORLD\N". Функция PRINTF

является библиотечной функцией, которая выдает выходные дан-

ные на терминал (если только не указано какое-то другое мес-

то назначения). В данном случае печатается строка символов,

являющаяся аргументом функции.

Последовательность из любого количества символов, зак-

люченных в удвоенные кавычки "...", называется 'символьной

строкой' или 'строчной константой'. Пока мы будем использо-

вать символьные строки только в качестве аргументов для

PRINTF и других функций.

Последовательность \N в приведенной строке является

обозначением на языке "C" для 'символа новой строки', кото-

рый служит указанием для перехода на терминале к левому краю

следующей строки. Если вы не включите \N (полезный экспери-

мент), то обнаружите, что ваша выдача не закончится перехо-

дом терминала на новую строку. Использование последователь-

ности \N - единственный способ введения символа новой строки

в аргумент функции PRINTF; если вы попробуете что-нибудь

вроде

PRINTF("HELLO, WORLD

");

то "C"-компилятор будет печатать злорадные диагностические

сообщения о недостающих кавычках.

Функция PRINTF не обеспечивает автоматического перехода

на новую строку, так что многократное обращение к ней можно

использовать для поэтапной сборки выходной строки. Наша пер-

вая программа, печатающая идентичную выдачу, с точно таким

же успехом могла бы быть написана в виде

MAIN()

{

PRINTF("HELLO, ");

PRINTF("WORLD");

PRINTF("\N");

}

Подчеркнем, что \N представляет только один символ. Ус-

ловные 'последовательности', подобные \N , дают общий и до-

пускающий расширение механизм для представления трудных для

печати или невидимых символов. Среди прочих символов в языке

"C" предусмотрены следующие: \т - для табуляции, \B - для

возврата на одну позицию, \" - для двойной кавычки и \\ для

самой обратной косой черты.

Упражнение 1-2

---------------

Проведите эксперименты для того, чтобы узнать что прои-

зойдет, если в строке, являющейся аргументом функции PRINTF

будет содержаться \X, где X - некоторый символ, не входящий

в вышеприведенный список.