Керниган и Ритчи - Язык программирования Си (793773), страница 6
Текст из файла (страница 6)
Проявляя некоторую дисциплину, можно легко писать переносимые программы, т. е.программы, которые без каких-либо изменений могут работать на разных машинах. Стандарт предоставляетвозможность для явного описания переносимости с помощью набора констант, отражающих характеристикимашины, на которой программа будет работать.Си не является "строго типизированным" языком, но в процессе его развития контроль за типами был усилен.В первой версии Си хоть не одобрялся, но разрешался бесконтрольный обмен указателей и целых, чтовызывало большие нарекания, но это уже давным-давно запрещено. Согласно стандарту теперь требуетсяявное объявление или явное указание преобразования, что уже и реализовано в хороших компиляторах.Новый вид объявления функций — еще один шаг в этом направлении.
Компилятор теперь предупреждает обольшей части ошибок в типах и автоматически не выполняет преобразования данных несовместимых типов.Однако основной философией Си остается то, что программисты сами знают, что делают; язык лишь требуетявного указания об их намерениях.Си, как и любой другой язык программирования, не свободен от недостатков. Уровень старшинстванекоторых операторов не является общепринятым, некоторые синтаксические конструкции могли бы бытьлучше. Тем не менее, как оказалось, Си — чрезвычайно эффективный и выразительный язык, пригодный дляширокого класса задач.Книга имеет следующую структуру. Глава 1 представляет собой обзор основных средств языка Си. Ееназначение — побудить читателя по возможности быстрее приступить к программированию, так как мыубеждены, что единственный способ изучить новый язык — это писать на нем программы.
Эта часть книгипредполагает наличие знаний по основным элементам программирования. Никаких пояснений того, чтотакое компьютер, компиляция или что означает выражение вида n = n+1 не дается. Хотя мы и пытались там,где это возможно, показать полезные приемы программирования, эта книга не призвана быть справочникомни по работе со структурами данных, ни по алгоритмам; когда оказывалось необходимым выбрать, на чтосделать ударение, мы предпочитали сконцентрировать внимание на языке.В главах 2-6 различные средства языка обсуждаются более подробно и несколько более формально, чем вглаве 1; при этом по-прежнему упор делается на примеры, являющиеся законченными программами, а неизолированными фрагментами.
Глава 2 знакомит с базовыми типами данных, с операторами и выражениями.В главе 3 рассматриваются средства управления последовательностью вычислений: if-else, switch,while, for и т. д. В главе 4 речь идет о функциях и структуре программы (внешних переменных, правилахвидимости, делении программы на несколько исходных файлов и т. д.), а также о препроцессоре. В главе 5обсуждаются указатели и адресная арифметика. Глава 6 посвящена структурам и объединениям.В главе 7 описана стандартная библиотека, обеспечивающая общий интерфейс с операционной системой.
Этабиблиотека узаконена в качестве стандарта ANSI, иначе говоря, она должна быть представлена на всехмашинах, где существует Си, благодаря чему программы, использующие ввод-вывод и другие возможностиоперационной системы, без каких-либо изменений можно переносить с одной машины на другую.Глава 8 содержит описание интерфейса между программами на Си и операционной системой UNIX, вчастности описание ввода-вывода, файловой системы и распределения памяти. Хотя некоторые параграфыэтой главы отражают специфику системы UNIX, программисты, пользующиеся другими системами, все женайдут в них много полезных сведений, включая определенный взгляд на то, как реализуется одна из версийстандартной библиотеки, и некоторые предложения по переносимости программ.Приложение А является справочником по языку.
Строгое определение синтаксиса и семантики языка Сисодержится в официальном документе стандарта ANSI. Последний, однако, более всего подходитразработчикам компилятора. Наш справочник определяет язык более сжато, не прибегая к педантичноюридическому стилю, которым пользуется стандарт. Приложение В — сводка по содержимому стандартнойбиблиотеки и предназначена скорее пользователям, чем реализаторам. В приложении С приводится краткийперечень отличий от пердой версии языка.
В сомнительных случаях, однако, окончательным судьей по языкуостается стандарт и компилятор, которым вы пользуетесь.1. Обзор языкаНачнем с быстрого ознакомления с языком Си. Наша цель — показать на реальных программах существенныеэлементы языка, не вдаваясь в мелкие детали, формальные правила и исключения из них.
Поэтому мы нестремимся к полноте и даже точности (заботясь, однако, о корректности примеров). Нам бы хотелось какможно скорее подвести вас к моменту, когда вы сможете писать полезные программы. Чтобы сделать это, мыдолжны сконцентрировать внимание на основах: переменных и константах, арифметике, управлениипоследовательностью вычислений, функциях и простейшем вводе-выводе. В настоящей главе мы умышленноне затрагиваем тех средств языка, которые важны при написании больших программ: указателей, структур,большой части богатого набора операторов, некоторых управляющих инструкций и стандартной библиотеки.Такой подход имеет свои недостатки.
Наиболее существенный из них состоит в том, что отдельноехарактерное свойство языка не описывается полностью в одном месте, и подобная лаконичность приобучении может привести к неправильному восприятию некоторых положений. В силу ограниченногохарактера подачи материала в примерах не используется вся мощь языка, и потому они не столь кратки иэлегантны, как могли бы быть. Мы попытались по возможности смягчить эти эффекты, но считаемнеобходимым предупредить о них.
Другой недостаток заключается в том, что в последующих главах какие-томоменты нам придется повторить. Мы надеемся, что польза от повторений превысит вызываемое имираздражение.В любом случае опытный программист должен суметь экстраполировать материал данной главы на своипрограммистские нужды. Новичкам же рекомендуем дополнить ее чтение написанием собственныхмаленьких программ. И те и другие наши читатели могут рассматривать эту главу как "каркас", на которыйдалее, начиная с главы 2, будут "навешиваться" элементы языка.1.1. Начнем, пожалуйЕдинственный способ выучить новый язык программирования — это писать на нем программы.
При изучениилюбого языка первой, как правило, предлагают написать приблизительно следующую программу:Напечатать слова здравствуй, мирВот первое препятствие, и чтобы его преодолеть, вы должны суметь где-то создать текст программы, успешноего скомпилировать, загрузить, запустить на выполнение и разобраться, куда будет отправлен результат. Кактолько вы овладеете этим, все остальное окажется относительно просто.Си-программа, печатающая "здравствуй, мир", выглядит так:#include <stdio.h>main(){printf ("здравствуй, мир\n");}Как запустить эту программу, зависит от системы, которую вы используете. Так, в операционной системе UNIXнеобходимо сформировать исходную программу в файле с именем, заканчивающимся символами ".c",например, в файле hello.c, который затем компилируется с помощью командыCC hello.сЕсли вы все сделали правильно — не пропустили где-либо знака и не допустили орфографических ошибок, токомпиляция пройдет "молча" и вы получите файл, готовый к исполнению и названный a.out.
Если вы теперьзапустите этот файл на выполнение командойa.outпрограмма напечатаетздравствуй, мирВ других системах правила запуска программы на выполнение могут быть иными; чтобы узнать о них,поговорите со специалистами.Теперь поясним некоторые моменты, касающиеся самой программы. Программа на Си, каких бы размеровона ни была, состоит из функций и переменных.
Функции содержат инструкции, описывающие вычисления,которые необходимо выполнить, а переменные хранят значения, используемые в процессе этих вычислений.Функции в Си похожи на подпрограммы и функции Фортрана или на процедуры и функции Паскаля.Приведенная программа — это функция с именем main. Обычно вы вольны придумывать любые имена длясвоих функций, но "main" — особое имя: любая программа начинает свои вычисления с первой инструкциифункции main.Обычно main для выполнения своей работы пользуется услугами других функций; одни из них пишутсясамим программистом, а другие берутся готовыми из имеющихся в его распоряжении библиотек. Перваястрока программы:#include <stdio.h>сообщает компилятору, что он должен включить информацию о стандартной библиотеке ввода-вывода.
Этастрока встречается в начале многих исходных файлов Си-программ. Стандартная библиотека описана в главе7 и приложении В.Один из способов передачи данных между функциями состоит в том, что функция при обращении к другойфункции передает ей список значений, называемых аргументами. Этот список берется в скобки ипомещается после имени функции.















