Керриган и д ритчи язык программирования си. Б.в. керниган, д.м. ричи. язык с. "Очевидно, что человек, который имел наибольшее влияние на мою карьеру это Кен Томпсон." - Деннис Ритчи

Деннис Ритчи – создатель языка программирования Cи. Он вместе с Кеном Томпсоном разработал Cи для создания операционной системы UNIX. «У Ньютона есть фраза о стоящих на плечах гигантов», – говорит Брайан Керниган. «Мы все стоим на плечах Денниса».

«Практически все в веб создано на основе – Cи и UNIX», – рассказал изданию Wired Роб Пайк (Rob Pike), легенда программирования. – «На языке Cи написаны браузеры. На ядре UNIX работает почти весь Интернет, и оно также написано на языке Си. Веб серверы – написаны на языке C. А если не на нем, то на Java или C++. А эти языки производные от Си. Python и Ruby также базируются на Cи. Я ручаюсь за то, что все сетевое оборудование работает на программах, написанных на С. Действительно трудно переоценить то, что, сколько всего в современной информационной экономике основано на работе Денниса».

«Недаром же Windows, когда-то написали на Cи, – добавляет он. А UNIX лежит и в основе настольной операционной системе Apple, Mac OS X и IOS. Эти системы установлены в iPhone и iPad».

Профессиональное становление

Деннис Макалистэр Ритчи (Dennis MacAlistair Ritchie) родился 9 сентября 1941 года. Его родной город – Бронксвилль, штат Нью-Йорк. Детство Денниса проходило в Нью-Джерси. Он окончил престижный американский ВУЗ - Гарвард. Особый интерес юного инженера вызвала местная компьютерная система Univac I. Там он получил степень бакалавра по физике и прикладной математике. После окончания обучения Ритчи устроился лаборантом в компьютерную лабораторию института MIT. Там он занимался поддержкой парка машин, а также разработкой софта.

Примерно в это же время он заинтересовался разработкой операционных систем для более компактных, настольных, компьютеров. (Тогда вычислительные машины «стандартного размера» занимали целые комнаты). MIT и General Electric поддержали его проект. Несмотря на отсутствие образования в области разработки ПО, для Денниса программирование никогда не было проблемой. Написание программ было для него подобно разгадыванию пазла.

В 1967 году Ритчи начал работать в лаборатории Bell Labs, где и сформировалась база для всех наиболее известных на сегодняшний день компьютерных изобретений. Но на тот момент Bell Labs был ведущим телекомпровайдером в стране.


Bell Labs

Начав работать в Bell Labs, Ритчи не стал фокусироваться на каком-то одном проекте: «Мне просто хотелось быть среди людей с разнообразным опытом и множеством идей. Поэтому я начал работать над несколькими проектами сразу, чтобы найти свой путь в профессии».

В компании Деннис начал работать с Кеннетом Томсоном, который присоединился к Bell Labs годом ранее, в 1966 году. Оба поняли, что «миниатюрные» настольные компьютеры будут набирать все большую популярность уже в начале 1970-х годов. Они также решили, что таким компьютерам необходим механизм, обеспечивающий управление аппаратными средствами компьютера, организующий работу с файлами и выполнение прикладных программ, осуществляющий ввод и вывод данных.

Так разработчики пришли к идее операционной системы. Изобретение языка Cи и роль Ритчи в разработке UNIX вместе с Кеном Томпсоном сделали его пионером современной вычислительной техники, как пишут в сети.

UNIX и Cи

Все началось в 1963 году, задолго до того, как Ритчи пришел в Bell Labs, – с проекта МАС (Multiple Access Computer, Machine-Aided Cognition, Man and Computer) начался как чисто исследовательский проект в MIT.

В рамках проекта МАС была разработана операционная система CTSS (Compatible Time-Sharing System). Во второй половине 60-х было создано несколько других систем с разделением времени, например, BBN, DTSS, JOSS, SDC и Multiplexed Information and Computing Service (MULTICS) в том числе.

Multics – совместная разработка MIT, Bell Telephone Laboratories (BTL) и General Electric (GE) по созданию ОС с разделением времени для компьютера GE-645. Последний компьютер под управлением Multics выключили 31 октября 2000 года.

Однако BTL отошел от этого проекта еще в начале 1969 года.

Кен Томпсон и Деннис Ритчи захотели продолжить работу самостоятельно. Томпсон работал над игрой Space Travel на GE-635. Ее написали сначала для Multics, а потом переписали на Фортране под GECOS на GE-635. Игра моделировала тела Солнечной системы, а игроку надо было посадить корабль куда-нибудь на планету или спутник.

Ни софт, ни железо этого компьютера не годились для такой игры. Томпсон искал альтернативу, и переписал игру под бесхозный PDP-7. Память была объемом 8К 18-битных слов, и еще был процессор векторного дисплея для вывода красивой для того времени графики.

Томпсон и Ритчи полностью вели разработку на кросс-ассемблере на GE и переносили код на перфолентах. Томпсону это активно не нравилось, и он начал писать ОС для PDP-7, начиная с файловой системы. Так появилась UNIX.

Ядро UNIX было написано на ассемблере, но вскоре Деннис и Кен поняли, что им необходим язык «более высокого уровня», который дал бы им больше контроля над всеми данными. Примерно в 1970 году, они попытались создать вторую версию ядра на языке Fortran, но результат не оправдал ожиданий. Тогда Ритчи предложил новый язык, основанный на создании Томпсона, известный как B(Би).

PDP-7 UNIX также положил начало высокоуровневому языку B, который создавался под влиянием языка BCPL. Деннис Ритчи сказал, что В - это Си без типов. BCPL помещался в 8 Кб памяти и был тщательно переработан Томпсоном. В постепенно вырос в С.


Изображение из книги «Язык Си»: M. Уэйт, С. Прата, Д. Мартин

В был интерпретируемым языком – то есть исходный код частями преобразовывался в машинный код в процессе выполнения специальной программой. Cи был компилируемым языком. Он переводился в машинный код, а затем непосредственно выполнялся в CPU. Но в те дни Cи считался языком высокого уровня. Он предоставил Ритчи и Томпсону больше гибкости, в которой они нуждались, и в то же время, выполнялся быстрее.

Первая версия языка Си не сильно отличалась от версии, которую мы знаем сегодня. Хотя она была чуть проще. Она предлагала структуры данных и «типы» переменных. И это то, что Ритчи и Томпсон использовали для создания их нового ядра UNIX. «Они создали C для того, чтобы написать программу», – говорит Пайк, который присоединился к Bell Labs спустя 10 лет. «А программу, которую они хотели написать, называлась ядро UNIX».

«Когда вы пишете большую программу как UNIX – вы должны управлять взаимодействиями между самыми разными компонентами: пользователями, файловой системой, дисками, выполнением программы, и для того, чтобы управлять этим эффективно, вы должны иметь хорошее представление о информации с которой работаете. Мы называем ее структурами данных», – говорит Пайк.

«Написать ядро без структуры данных, с таким же строением и совершенством, как ядро UNIX – было бы намного сложнее. Им необходим был способ группировки всех данных, а реализовать это в Fortran было не возможно».

В то время это был необычный способ написания операционной системы, и именно это позволило Ритчи и Томпсону, в конечном счете, перенести операционную систему на другие платформы, что они и сделали в конце 70-х. «Это открыло шлюзы для работы UNIX на любой платформе», – говорит Пайк. «Все это стало возможным благодаря Cи».

«Незримый король»

«Разработка языка программирования Cи стала огромным шагом вперед и правильным компромиссом … В Си нашелся правильный баланс, позволяющий писать на высоком уровне, что стало более продуктивным, а в нужный момент, можно было контролировать все что происходит», – рассказывает Билл Далли, главный научный сотрудник NVIDIA и Bell Professor of Engineering в Стэнфорде. «[Си ] задает тон в программировании в течение нескольких десятилетий».

Как уже отмечалось Пайком, структуры данных, которые Ритчи встроил в Cи, в конечном итоге, привели к объектно-ориентированной парадигме, используемой такими современными языками, как C++ и Java.

Революция началась в 1973 году, когда Ритчи опубликовал свою научную работу о языке, а спустя пять лет, вместе со своим коллегой Брайаном Керниганом выпустил книгу: «Язык программирования Cи». Ранее Керниган уже писал учебники по языку, и в какой-то момент, он убедил Денниса написать книгу с ним.

Пайк прочитал книгу, будучи студентом Торонтского университета. Он взял книгу, когда возвращался домой из-за болезни. «Этот справочник – образец ясности и четкости изложения по сравнению с недавно вышедшими справочниками. Он по праву является классикой», – говорит он. «Я прочитал его, когда лежал больной в постели, и он заставил меня забыть о болезни».

Как и многие студенты университета, Пайк уже программировал на этом языке. Си распространился по всем кампусам колледжа, поскольку в Bell Labs начали раздавать исходный код UNIX. Помимо всего операционная система дала толчок к развитию современного движения свободного программного обеспечения. Пайк не преувеличивает, когда говорит, что вклад Ритчи невозможно переоценить. И хотя Ритчи получил премию Тьюринга в 1983 году и Национальную медаль в области технологий в 1998 году, ему до сих пор не воздали должное.

Керниган и Пайк описывают Ритчи как необычайно скрытного человека. «Более 20 лет я проработал на противоположной стороне зала, и все же, считаю, что не знал его хорошо», – говорит Пайк.

Стив Джобс также был скрытным человеком, и его позиционирование на скрытности только усилило культ личности, окруживший его. Ритчи жил в совершенно иное время и работал в совершенно иных условиях в отличии от таких как Джобс. Возможно, поэтому Ритчи не был столь популярен.

«Джобс был зримым королем, а Ритчи, преимущественно, незримым королем», – так сказал Мартин Ринард, профессор электротехники и компьютерных наук Массачусетского технологического института и член Computer Science and Artificial Intelligence Laboratory.

«Гений Джобса состоит в том, что он имел вкус и создавал продукты, которыми люди хотели пользоваться. И он мог создавать вещи, которые, по-настоящему, нравились людям. Ритчи создал то, что технари смогли использовать для создания базовой инфраструктуры. Людям не обязательно ее видеть, несмотря на то, что они используют ее каждый день».

После UNIX

Основная проблема UNIX, с точки зрения ее же авторов, заключалась в том, что в силу своей архитектуры ОС не могла прозрачно приспособиться к значительно изменившемуся со времен ее разработки IT-миру. Проще говоря, UNIX умирала от собственных проблем, а все попытки приспособить ее к современным условиям приводили к усложнению ОС, введению множества разрозненных, сложных API, новых прослоек, сетевых протоколов, форматов данных, что сделало когда-то простую, продуманную, элегантную ОС тяжелым, неповоротливым и сложным в сопровождении комком кода.

Вспоминая успехи UNIX, Ритчи продолжал до самой смерти исследования в области операционных систем и языков программирования. Он внес значительный вклад в разработку операционных систем Plan 9 и Inferno, а также языка программирования Limbo.

Когда исследователи из Bell Labs поняли, что UNIX уже не исправить они решили начать с нуля и разработали новую, никак не связанную и несовместимую с UNIX, операционную систему с эксцентричным именем Plan 9.


Главная идея Plan 9 заключалась в том, чтобы довести концепцию «все есть файл» до логического триумфа и построить из синтетических файлов всю ОС (а если говорить конкретнее – представить все ресурсы операционной системы файлами). Причем сделать это так, чтобы к файлам имели доступ не только локальные приложения и пользователи, но и любой удаленный клиент. В результате появился файловый протокол 9P.
В 1995 году компания Lucent Technologies, новый владелец исследовательских лабораторий Bell Labs, перевела многих разработчиков Plan 9 в другую команду, которая занялась созданием операционной системы Inferno, построенной на базе Plan 9.

Руководство компании не без оснований полагало, что Plan 9, способная прозрачно и легко работать на компьютерах, организованных в распределенную вычислительную сеть, отлично покажет себя на маломощных мобильных устройствах и терминалах, которые в то время были просто обязаны перекладывать львиную долю своих функций на другие машины, чтобы обеспечить оптимальную производительность и удобство использования.

Кроме переносимости и производительности, Inferno обладает еще одной очень важной особенностью: наличием языка прикладного программирования Limbo, который был разработан с нуля специально для Inferno и существует только в рамках этой ОС. Его синтаксис во многом повторяет синтаксис Си, но имеет вкрапления из множества других языков.

Конец легенды

12 октября 2011 года Ритчи был найден мёртвым у себя дома в Нью-Джерси, где проживал в одиночестве. Первые новости о смерти сообщил его бывший коллега Роб Пайк: «Деннис Ритчи скончался в эти выходные у себя дома». Причина и точное время смерти остались неизвестными. Незадолго до этого он лечил рак простаты, также у него было больное сердце. Ритчи умер спустя неделю со смерти Стива Джобса, но в отличие от Джобса, смерть Ритчи была мало освещена в СМИ.

Спасибо, что скачали книгу в бесплатной электронной библиотеке Royallib.ru

Эта же книга в других форматах

Приятного чтения!

Б. Керниган, д. Ритчи

Язык программирования Си

Издание 3-е, исправленное

Предисловие

С момента публикации в 1978 г. книги "Язык программирования Си" в мире компьютеров произошла революция. Большие машины стали еще больше, а возможности персональных ЭВМ теперь сопоставимы с возможностями больших машин десятилетней давности. Язык Си за это время также изменился, хотя и не очень сильно; что же касается сферы применения Си, то она далеко вышла за рамки его начального назначения как инструментального языка операционной системы UNIX.

Рост популярности Си, накапливающиеся с годами изменения, создание компиляторов коллективами разработчиков, ранее не причастных к проектированию языка, - все это послужило стимулом к более точному и отвечающему времени определению языка по сравнению с первым изданием книги. В 1983 г. Американский институт национальных стандартов (American National Standards Institute - ANSI) учредил комитет, перед которым была поставлена цель выработать "однозначное и машинно-независимое определение языка Си", полностью сохранив при этом его стилистику. Результатом работы этого комитета и явился стандарт ANSI языка Си.

Стандарт формализует средства языка, которые в первом издании были только намечены, но не описаны, такие, например, как присваивание структурам и перечисления. Он вводит новый вид описания функций, позволяющий проводить повсеместную проверку согласованности вызовов функций с их определением; специфицирует стандартную библиотеку с широким набором функций ввода-вывода, управления памятью, манипуляций со строками символов и другими функциями; уточняет семантику, бывшую в первоначальном определении неясной, и явно выделяет то, что остается машинно-зависимым.

Во втором издании книги "Язык программирования Си" представлена версия Си, принятая в качестве стандарта ANSI. Мы решили описать язык заново, отметив при этом те места, в которых он претерпел изменения. В большинство параграфов это не привнесло существенных перемен, самые заметные различия касаются новой формы описания и определения функции. Следует отметить, что современные компиляторы уже обеспечили поддержку значительной части стандарта.

Мы попытались сохранить краткость первого издания. Си - небольшой язык, и чтобы его описать большой книги не требуется. В новом издании улучшено описание наиболее важных средств, таких как указатели, которые занимают центральное место в программировании на Си; доработаны старые примеры, а в некоторые главы добавлены новые. Так, для усиления трактовки сложных объявлений в качестве примеров включены программы перевода объявлений в их словесные описания и обратно. Как и раньше, все примеры были протестированы прямо по текстам, написанным в воспринимаемой машиной форме.

Приложение A - это справочное руководство, но отнюдь не стандарт. В нем мы попытались уложить самое существенное на минимуме страниц. По замыслу это приложение должно легко читаться программистом-пользователем: для разработчиков же компилятора определением языка должен служить сам стандарт. В приложении B приведены возможности стандартной библиотеки. Оно также представляет собой справочник для прикладных программистов, но не для разработчиков компиляторов. Приложение C содержит краткий перечень отличий представленной версии языка Си от его начальной версии.

В предисловии к первому изданию мы говорили о том, что "чем больше работаешь с Си, тем он становится удобнее". Это впечатление осталось и после десяти лет работы с ним. Мы надеемся, что данная книга поможет вам изучить Си и успешно его использовать.

Мы в большом долгу перед друзьями, которые помогали нам в выпуске второго издания книги. Джон Бентли, Дуг Гунн, Дуг Макилрой, Питер Нельсон и Роб Пайк сделали четкие замечания почти по каждой странице первого варианта рукописи. Мы благодарны Алу Ахо, Деннису Аллиссону, Джою Кемпбеллу, Г. Р. Эмлину, Карен Фортганг, Аллену Голубу, Эндрю Хьюму, Дэйву Кристолу, Джону Линдерману, Дэйву Проссеру, Гину Спаффорду и Крису Ван Уику за внимательное прочтение книги. Мы получили полезные советы от Билла Чезвика, Марка Кернигана, Эндрю Коэнига, Робина Лейка, Тома Лондона, Джима Ридза, Кловиза Тондо и Питера Вайнбергера. Дейв Проссер ответил на многочисленные вопросы, касающиеся деталей стандарта ANSI. Мы широко пользовались транслятором с Си++ Бьерна Страуструпа для локальной проверки наших программ, а Дейв Кристол предоставил нам ANSI Си-компилятор для окончательной их проверки. Рич Дрешлер очень помог в наборе книги. Мы искренне благодарим всех.

Брайан В. Керниган, Деннис М. Ритчи

Транскрипт

1 Б.В. Керниган, Д.М. Ричи. ЯЗЫК С

2 Аннотация Язык "C"(произносится "си") это универсальный язык программирования, для которого характерны экономичность выражения, современный поток управления и структуры данных, богатый набор операторов. Язык "C" не является ни языком "очень высокого уровня", ни "большим" языком, и не предназначается для некоторой специальной области применения. но отсутствие ограничений и общность языка делают его более удобным и эффективным для многих задач, чем языки, предположительно более мощные. Язык "C", первоначально предназначавшийся для написания операционной системы "UNIX" на ЭВМ DEC PDP-11, былразработаниреализованнаэтойсистеме Деннисом Ричи. Операционная система, компилятор с языка "C" и по существу все прикладные программы системы "UNIX" (включая все программное обеспечение, использованное при подготовке этой книги) написаны на "C". Коммерческие компиляторы с языка "C" существуют также на некоторых других ЭВМ, включая IBM SYSTEM/370, HONEYWELL 6000, INTERDATA 8/32. Язык "C", однако, не связан с какими-либо определенными аппаратными средствами или системами, инанемлегко писать программы, которые можно пропускать без изменений на любой ЭВМ, имеющей "C"-компилятор. Эта книга предназначена для того, чтобы помочь читателю научиться программировать на языке "C". Она содержит учебное введение, цель которого позволить новым пользователям начать программировать как можно быстрее, отдельные главы по всем основным особенностям языка и справочное руководство. Обучение построено в основном на чтении, написании и разборе примеров, а не голой формулировке правил. Примеры, приводимые в книге, по большей части являются законченными реальными программами, а не отдельными фрагментами. Все примеры были проверены непосредственно с текста книги, где они напечатаны в виде, пригодном для ввода в машину. Кроме указаний о том, как сделать использование языка более эффективным, мы также пытались, где это возможно, проиллюстрировать полезные алгоритмы и принципы хорошего стиля и разумной разработки. Настоящая книга не является вводным курсом в программирование; она предполагает определенное знакомство с основными понятиями программирования такими как переменные, операторы присваивания, циклы, функции. Тем не менее и новичок в программировании должен оказаться в состоянии читать подряд и освоиться с языком, хотя при этом была бы полезной помощь более опытного коллеги. По нашему опыту, "C" показал себя приятным, выразительным и разносторонним языком на широком множестве разнообразных программ. Его легко выучить, ионнетеряетсвоихкачествсростомопытапрограммиста. Мы надеемся, что эта книга поможет вам хорошо его использовать. Вдумчивая критика и предложения многих наших друзей и коллег очень много добавили как для самой книги, так и для нашего удовольствия при ее написании. В частности, Майк Биапси, Джим Блю, Стью Фельдман, Доуг Мак-Илрой, Билл Рум, Боб Розин и Ларри Рослер тщательно прочитали множество вариантов. Мы также обязаны Элю Ахо, Стиву Борну, Дэву Двораку, Чаку Хэлею, Дебби Хэлей, Мариону Харрису, Рику Холту, Стиву Джонсону, Джону Машею, Бобу Митцу, Ральфу Мьюа, Питеру Нельсону, Эллиоту Пинсону, Биллу Плагеру, Джерри Спиваку, Кену Томпсону и Питеру Вейнбергеру за полезные замечания на различных этапах и Майку Лоску и Джо Осанна за неоценимую помощь при печатании книги. Брайен В. Керниган Деннис М. Ричи


3 Содержание ВВЕДЕНИЕ 9 1. УЧЕБНОЕ ВВЕДЕНИЕ HАЧИНАЕМ ПЕРЕМЕННЫЕ И АРИФМЕТИКА ОПЕРАТОР FOR СИМВОЛИЧЕСКИЕ КОНСТАНТЫ НАБОР ПОЛЕЗНЫХ ПРОГРАММ ВВОД И ВЫВОД СИМВОЛОВ КОПИРОВАНИЕ ФАЙЛА ПОДСЧЕТ СИМВОЛОВ ПОДСЧЕТ СТРОК ПОДСЧЕТ СЛОВ МАССИВЫ ФУНКЦИИ АРГУМЕНТЫ ВЫЗОВ ПО ЗНАЧЕНИЮ МАССИВЫ СИМВОЛОВ ОБЛАСТЬ ДЕЙСТВИЯ: ВНЕШНИЕ ПЕРЕМЕННЫЕ ТИПЫ, ОПЕРАЦИИ И ВЫРАЖЕНИЯ ИМЕНА ПЕРЕМЕННЫХ ТИПЫ И РАЗМЕРЫ ДАННЫХ КОНСТАНТЫ СИМВОЛЬНАЯ КОНСТАНТА КОНСТАНТНОЕ ВЫРАЖЕНИЕ СТРОЧНАЯ КОНСТАНТА ОПИСАНИЯ АРИФМЕТИЧЕСКИЕ ОПЕРАЦИИ ОПЕРАЦИИ ОТНОШЕНИЯ И ЛОГИЧЕСКИЕ ОПЕРАЦИИ ПРЕОБРАЗОВАНИЕ ТИПОВ ОПЕРАЦИИ УВЕЛИЧЕНИЯ И УМЕНЬШЕНИЯ ПОБИТОВЫЕ ЛОГИЧЕСКИЕ ОПЕРАЦИИ ОПЕРАЦИИ И ВЫРАЖЕНИЯ ПРИСВАИВАНИЯ УСЛОВНЫЕ ВЫРАЖЕНИЯ СТАРШИНСТВО И ПОРЯДОК ВЫЧИСЛЕНИЯ ПОТОК УПРАВЛЕНИЯ ОПЕРАТОРЫ И БЛОКИ IF ELSE ELSE IF ПЕРЕКЛЮЧАТЕЛЬ ЦИКЛЫ WHILEИ FOR ОПЕРАТОР BREAK 67


4 3.8. ОПЕРАТОР CONTINUE ОПЕРАТОР GOTO ИМЕТКИ ФУНКЦИИ И СТРУКТУРА ПРОГРАММ ОСНОВНЫЕ СВЕДЕНИЯ ФУНКЦИИ, ВОЗВРАЩАЮЩИЕ НЕЦЕЛЫЕ ЗНАЧЕНИЯ ЕЩЕ ОБ АРГУМЕНТАХ ФУНКЦИЙ ВНЕШНИЕ ПЕРЕМЕННЫЕ ПРАВИЛА, ОПРЕДЕЛЯЮЩИЕ ОБЛАСТЬ ДЕЙСТВИЯ ОБЛАСТЬ ДЕЙСТВИЯ СТАТИЧЕСКИЕ ПЕРЕМЕННЫЕ РЕГИСТРОВЫЕ ПЕРЕМЕННЫЕ БЛОЧНАЯ СТРУКТУРА ИНИЦИАЛИЗАЦИЯ РЕКУРСИЯ ПРЕПРОЦЕССОР ЯЗЫКА "C" ВКЛЮЧЕНИЕ ФАЙЛОВ МАКРОПОДСТАНОВКА 93 5.УКАЗАТЕЛИ И МАССИВЫ УКАЗАТЕЛИИАДРЕСА УКАЗАТЕЛИ И АРГУМЕНТЫ ФУНКЦИЙ УКАЗАТЕЛИ И МАССИВЫ АДРЕСНАЯ АРИФМЕТИКА УКАЗАТЕЛИ СИМВОЛОВ И ФУНКЦИИ УКАЗАТЕЛИ НЕ ЦЕЛЫЕ МНОГОМЕРНЫЕ МАССИВЫ МАССИВЫ УКАЗАТЕЛЕЙ; УКАЗАТЕЛИ УКАЗАТЕЛЕЙ ИНИЦИАЛИЗАЦИЯ МАССИВОВ УКАЗАТЕЛЕЙ УКАЗАТЕЛИ И МНОГОМЕРНЫЕ МАССИВЫ КОМАНДНАЯ СТРОКА АРГУМЕНТОВ УКАЗАТЕЛИ НА ФУНКЦИИ СТРУКТУРЫ ОСНОВНЫЕ СВЕДЕНИЯ СТРУКТУРЫ И ФУНКЦИИ МАССИВЫ СТРУКТУР УКАЗАТЕЛИ НА СТРУКТУРЫ СТРУКТУРЫ, ССЫЛАЮЩИЕСЯ НА СЕБЯ ПОИСК В ТАБЛИЦЕ ПОЛЯ ОБЪЕДИНЕНИЯ ОПРЕДЕЛЕНИЕ ТИПА ВВОД И ВЫВОД ОБРАЩЕНИЕ К СТАНДАРТНОЙ БИБЛИОТЕКЕ СТАНДАРТНЫЙ ВВОД И ВЫВОД ФУНКЦИИ GETCHAR И PUTCHAR 150


5 7.3. ФОРМАТНЫЙ ВЫВОД ФУНКЦИЯ PRINTF ФОРМАТНЫЙ ВВОД ФУНКЦИЯ SCANF ФОРМАТНОЕ ПРЕОБРАЗОВАНИЕ В ПАМЯТИ ДОСТУП К ФАЙЛАМ ОБРАБОТКА ОШИБОК STDERR И EXIT ВВОД И ВЫВОД СТРОК НЕСКОЛЬКО РАЗНООБРАЗНЫХ ФУНКЦИЙ ПРОВЕРКА ВИДА СИМВОЛОВ И ПРЕОБРАЗОВАНИЯ ФУНКЦИЯ UNGETC ОБРАЩЕНИЕ К СИСТЕМЕ УПРАВЛЕНИЕ ПАМЯТЬЮ ИНТЕРФЕЙС СИСТЕМЫ UNIX ДЕСКРИПТОРЫ ФАЙЛОВ НИЗКОУРОВНЕВЫЙ ВВОД/ВЫВОД ОПЕРАТОРЫ READ И WRITE ОТКРЫТИЕ, СОЗДАНИЕ, ЗАКРЫТИЕ И РАСЦЕПЛЕНИЕ (UNLINK) ПРОИЗВОЛЬНЫЙ ДОСТУП SEEK И LSEEK ПРИМЕР РЕАЛИЗАЦИЯ ФУНКЦИЙ FOPEN И GETC ПРИМЕР РАСПЕЧАТКА СПРАВОЧНИКОВ ПРИМЕР РАСПРЕДЕЛИТЕЛЬ ПАМЯТИ ПРИЛОЖЕНИЕ А: СПРАВОЧНОЕ РУКОВОДСТВО ПО ЯЗЫКУ "C" ВВЕДЕНИЕ ЛЕКСИЧЕСКИЕ СОГЛАШЕНИЯ КОММЕНТАРИИ ИДЕНТИФИКАТОРЫ (ИМЕНА) КЛЮЧЕВЫЕ СЛОВА КОНСТАНТЫ ЦЕЛЫЕ КОНСТАНТЫ ЯВНЫЕ ДЛИННЫЕ КОНСТАНТЫ СИМВОЛЬНЫЕ КОНСТАНТЫ ПЛАВАЮЩИЕ КОНСТАНТЫ СТРОКИ ХАРАКТЕРИСТИКИ АППАРАТНЫХ СРЕДСТВ СИНТАКСИЧЕСКАЯ НОТАЦИЯ ЧТО В ИМЕНЕ ТЕБЕ МОЕМ? ОБЪЕКТЫ И L-ЗНАЧЕНИЯ 187


6 14. ПРЕОБРАЗОВАНИЯ СИМВОЛЫ И ЦЕЛЫЕ ТИПЫ FLOAT И DOUBLE ПЛАВАЮЩИЕ И ЦЕЛОЧИСЛЕННЫЕ ВЕЛИЧИНЫ УКАЗАТЕЛИ И ЦЕЛЫЕ ЦЕЛОЕ БЕЗ ЗНАКА АРИФМЕТИЧЕСКИЕ ПРЕОБРАЗОВАНИЯ ВЫРАЖЕНИЯ ПЕРВИЧНЫЕ ВЫРАЖЕНИЯ УНАРНЫЕ ОПЕРАЦИИ МУЛЬТИПЛИКАТИВНЫЕ ОПЕРАЦИИ АДДИТИВНЫЕ ОПЕРАЦИИ ОПЕРАЦИИ СДВИГА ОПЕРАЦИИ ОТНОШЕНИЯ ОПЕРАЦИИ РАВЕНСТВА ПОБИТОВАЯ ОПЕРАЦИЯ "И" ПОБИТОВАЯ ОПЕРАЦИЯ ИСКЛЮЧАЮЩЕГО "ИЛИ" ПОБИТОВАЯ ОПЕРАЦИЯ ВКЛЮЧАЮЩЕГО "ИЛИ" ЛОГИЧЕСКАЯ ОПЕРАЦИЯ "И" ОПЕРАЦИЯ ЛОГИЧЕСКОГО "ИЛИ" УСЛОВНАЯ ОПЕРАЦИЯ ОПЕРАЦИЯ ПРИСВАИВАНИЯ ОПЕРАЦИЯ ЗАПЯТАЯ ОПИСАНИЯ СПЕЦИФИКАТОРЫ КЛАССА ПАМЯТИ СПЕЦИФИКАТОРЫ ТИПА ОПИСАТЕЛИ СМЫСЛ ОПИСАТЕЛЕЙ ОПИСАНИЕ СТРУКТУР И ОБЪЕДИНЕНИЙ ИНИЦИАЛИЗАЦИЯ ИМЕНА ТИПОВ TYPEDEF ОПЕРАТОРЫ ОПЕРАТОРНОЕ ВЫРАЖЕНИЕ СОСТАВНОЙ ОПЕРАТОР (ИЛИ БЛОК) УСЛОВНЫЕ ОПЕРАТОРЫ ОПЕРАТОР WHILE ОПЕРАТОР DO ОПЕРАТОР FOR ОПЕРАТОР SWITCH ОПЕРАТОР BREAK ОПЕРАТОР CONTINUE ОПЕРАТОР ВОЗВРАТА ОПЕРАТОР GOTO 211


7 ПОМЕЧЕННЫЙ ОПЕРАТОР ПУСТОЙ ОПЕРАТОР ВНЕШНИЕ ОПРЕДЕЛЕНИЯ ВНЕШНЕЕ ОПРЕДЕЛЕНИЕ ФУНКЦИИ ВНЕШНИЕ ОПРЕДЕЛЕНИЯ ДАННЫХ ПРАВИЛА, ОПРЕДЕЛЯЮЩИЕ ОБЛАСТЬ ДЕЙСТВИЯ ЛЕКСИЧЕСКАЯ ОБЛАСТЬ ДЕЙСТВИЯ ОБЛАСТЬ ДЕЙСТВИЯ ВНЕШНИХ ИДЕНТИФИКАТОРОВ СТРОКИ УПРАВЛЕНИЯ КОМПИЛЯТОРОМ ЗАМЕНА ЛЕКСЕМ ВКЛЮЧЕНИЕ ФАЙЛОВ УСЛОВНАЯ КОМПИЛЯЦИЯ НЕЯВНЫЕ ОПИСАНИЯ СНОВА О ТИПАХ СТРУКТУРЫ И ОБЪЕДИНЕНИЯ ФУНКЦИИ МАССИВЫ, УКАЗАТЕЛИ И ИНДЕКСАЦИЯ ЯВНЫЕ ПРЕОБРАЗОВАНИЯ УКАЗАТЕЛЕЙ КОНСТАНТНЫЕ ВЫРАЖЕНИЯ СООБРАЖЕНИЯ О ПЕРЕНОСИМОСТИ АНАХРОНИЗМЫ СВОДКА СИНТАКСИЧЕСКИХ ПРАВИЛ ВЫРАЖЕНИЯ ОПИСАНИЯ ПРИСВАИВАНИЕ СТРУКТУРЫ 227


8 28. ТИП ПЕРЕЧИСЛЕНИЯ ТАБЛИЦА ИЗОБРАЖЕНИЙ НЕПЕЧАТНЫХ СИМВОЛОВ ЯЗЫКА "C". 229

9 Б.В. Керниган, Д.М. Ричи. Язык С. 9 Введение Язык "C" является универсальным языком программирования. Он тесно связан с операционной системой "UNIX", так как был развит на этой системе и так как "UNIX" и ее программное обеспечение написано на "C". Сам язык, однако, не связан с какой-либо одной операционной системой или машиной; и хотя его называют языком системного программирования, так как он удобен для написания операционных систем, он с равным успехом использовался при написании больших вычислительных программ, программ для обработки текстов и баз данных. Язык "C" это язык относительно "низкого уровня". В такой характеристике нет ничего оскорбительного; это просто означает, что "C" имеет дело с объектами того же вида, что и большинство ЭВМ, аименно, ссимволами, числами и адресами. Они могут объединяться и пересылаться посредством обычных арифметических и логических операций, осуществляемых реальными ЭВМ. В языке "C" отсутствуют операции, имеющие дело непосредственно с составными объектами, такими как строки символов, множества, списки или с массивами, рассматриваемыми как целое. Здесь, например, нет никакого аналога операциям PL/1, оперирующим с целыми массивами и строками. Язык не предоставляет никаких других возможностей распределения памяти, кроме статического определения и механизма стеков, обеспечиваемого локальными переменных функций; здесь нет ни "куч"(heap), ни "сборки мусора", как это предусматривается в АЛГОЛЕ- 68. Наконец, сам по себе "C" не обеспечивает никаких возможностей ввода-вывода: здесь нет операторов READ или WRITE и никаких встроенных методов доступа к файлам. Все эти механизмы высокого уровня должны обеспечиваться явно вызываемыми функциями. Аналогично, язык "C" предлагает только простые, последовательные конструкции потоков управления: проверки, циклы, группирование и подпрограммы, но не мультипрограммирование, параллельные операции, синхронизацию или сопрограммы. Хотя отсутствие некоторых из этих средств может выглядеть как удручающая неполноценность ("выходит, что я должен обращаться к функции, чтобы сравнить две строки символов?!"), но удержание языка в скромных размерах дает реальные преимущества. Так как "C" относительно мал, он не требует много места для своего описания и может быть быстро выучен. Компилятор с "C" может быть простым и компактным. Кроме того, компиляторы легко пишутся; при использовании современной технологии можно ожидать написания компилятора для новой ЭВМ за пару месяцев и при этом окажется, что 80 процентов программы нового компилятора будет общей с программой для уже существующих компиляторов. Это обеспечивает высокую степень мобильности языка. Поскольку типы данных и стуктуры управления, имеющиеся в "C", непосредственно поддерживаются большинством существующих ЭВМ, библиотека, необходимая во время прогона изолированных программ, оказывается очень маленькой. На PDP -11, например, она содержит только программы для 32-битового умножения и деления и для выполнения программ ввода и вывода последовательностей. Конечно, каждая реализация обеспечивает исчерпывающую, совместимую библиотеку функций для выполнения операций ввода-вывода, обработки строк и распределения памяти, но так как обращение к ним осуществляется только явно, можно, если необходимо, избежать их вызова; эти функции могут быть компактно написаны на самом "C". Опять же из-за того, что язык "C" отражает возможности современных компьютеров, программы на "C" оказываются достаточно эффективными, так что не


10 Б.В. Керниган, Д.М. Ричи. Язык С. 10 возникает побуждения писать вместо этого программы на языке ассемблера. Наиболее убедительным примером этого является сама операционная система "UNIX", которая почти полностью написана на "C". Из строк программы системы только около 800 строк самого низкого уровня написаны на ассемблере. Кроме того, по существу все прикладное программное обеспечение системы "UNIX" написано на "C"; подавляющее большинство пользователей системы "UNIX"(включая одного из авторов этой книги) даже не знает языка ассемблера PDP-11. Хотя "C" соответствует возможностям многих ЭВМ, он не зависит от какой-либо конкретной архитектуры машины и в силу этого без особых усилий позволяет писать "переносимые" программы, т.е. программы, которые можно пропускать без изменений на различных аппаратных средствах. В наших кругах стал уже традицией перенос программного обеспечения, разработанного на системе "UNIX", на системы ЭВМ: HONEYWELL, IBM и INTERDATA. Фактически компиляторы с "C" и программное обеспечение во время прогона программ на этих четырех системах, по-видимому, гораздо более совместимы, чем стандартные версии фортрана американского национального института стандартов (ANSI). Сама операционная система "UNIX" теперь работает как на PDP-11, так и на INTERDATA 8/32. За исключением программ, которые неизбежно оказываются в некоторой степени машинно-зависимыми, таких как компилятор, ассемблер и отладчик. Написанное на языке "C" программное обеспечение идентично на обеих машинах. Внутри самой операционной системы 7000 строк программы, исключая математическое обеспечение языка ассемблера ЭВМ и управления операциями ввода-вывода, совпадают на 95 процентов. Программистам, знакомым с другими языками, для сравнения и противопоставления может оказаться полезным упоминание нескольких исторических, технических и философских аспектов "C". Многие из наиболее важных идей "C" происходят от гораздо более старого, но все еще вполне жизненного языка BCPL, разработанного Мартином Ричардсом. Косвенно язык BCPL оказал влияние на "C" через язык "B", написанный Кеном Томпсоном в 1970 году для первой операционной системы "UNIX" на ЭВМ PDP-7. Хотя язык "C" имеет несколько общих с BCPL характерных особенностей, он никоим образом не является диалектом последнего. И BCPL и "B" "безтипные" языки; единственным видом данных для них являются машинное слово, адоступк другим объектам реализуется специальными операторами или обращением к функциям. Вязыке"C" объектами основных типов данных являются символы, целые числа нескольких размеров и числа с плавающей точкой. Кроме того, имеется иерархия производных типов данных, создаваемых указателями, массивами, структурами, объединениями и функциями. Язык "C" включает основные конструкции потока управления, требуемые для хорошо структуированных программ: группирование операторов, принятие решений (IF), циклы с проверкой завершения в начале (WHILE, FOR) или в конце (DO) и выбор одного из множества возможных вариантов (SWITCH). (Все эти возможности обеспечивались и в BCPL, хотя и при несколько отличном синтаксисе; этот язык предчувствовал наступившую через несколько лет моду на структурное программирование). В языке "C" имеются указатели и возможность адресной арифметики. Аргументы передаются функциям посредством копирования значения аргумента, и вызванная функция не может изменить фактический аргумент в вызывающей программе. Если желательно добиться "вызова по ссылке", можно неявно передать указатель, и функция сможет изменить объект, на который этот указатель указывает. Имена массивов передаются указанием начала массивов, так что аргументы типа массивов эффективно вызываются по ссылке.

11 Б.В. Керниган, Д.М. Ричи. Язык С. 11 К любой функции можно обращаться рекурсивно, и ее локальные переменные обычно "автоматические", т.е. Создаются заново при каждом обращении. Описание одной функции не может содержаться внутри другой, но переменные могут описываться в соответствии с обычной блочной структурой. Функции в "C" программе могут транслироваться отдельно. переменные по отношению к функции могут быть внутренними, внешними, но известными только в пределах одного исходного файла, или полностью глобальными. Внутренние переменные могут быть автоматическими или статическими. Автоматические переменные для большей эффективности можно помещать в регистры, но объявление регистра является только указанием для компилятора и никак не связано с конкретными машинными регистрами. Язык "C" не является языком со строгими типами в смысле паскаля или алгола 68. Он сравнительно снисходителен к преобразованию данных, хотя и не будет автоматически преобразовывать типы данных с буйной непринужденностью языка PL/1. Существующие компиляторы не предусматривают никакой проверки во время выполнения программы индексов массивов, типов аргументов и т.д. В тех ситуациях, когда желательна строгая проверка типов, используется специальная версия компилятора. Эта программа называется LINT очевидно потому, она выбирает кусочки пуха из вашей программы. Программа LINT не генерирует машинного кода, а делает очень строгую проверку всех тех сторон программы, которые можно проконтролировать во время компиляции и загрузки. Она определяет несоответствие типов, несовместимость аргументов, неиспользованные или очевидным образом неинициализированные переменные, потенциальные трудности переносимости и т.д. Для программ,которые благополучно проходят через LINT, гарантируется отсутствие ошибок типа примерно с той же полнотой, как и для программ, написанных, например, на АЛГОЛЕ-68. Другие возможности программы LINT будут отмечены, когда представится соответствующий случай. Наконец, язык "C", подобно любому другому языку, имеет свои недостатки. Некоторые операции имеют неудачное старшинство; некоторые разделы синтаксиса могли бы быть лучше; сушествует несколько версий языка, отличающихся небольшими деталями. Тем не менее язык "C" зарекомендовал себя как исключительно эффективный и выразительный язык для широкого разнообразия применений программирования. Содержание книги организовано следующим образом. Глава 1 является учебным введением в центральную часть языка "C". Цель позволить читателю стартовать так быстро,как только возможно, так как мы твердо убеждены, что единственный способ изучить новый язык писать на нем программы. При этом, однако, предполагается рабочее владение основными элементами программирования; здесь не объясняется, что такое ЭВМ или компилятор, не поясняется смысл выражений типа N=N+1. Хотя мы и пытались, где это возможно, продемонстрировать полезную технику программирования. Эта книга не предназначается быть справочным руководством по структурам данных и алгоритмам; там, где мы вынуждены были сделать выбор, мы концентрировались на языке. В главах со 2-й по 6-ю различные аспекты "C" излагаются более детально и несколько более формально, чем в главе 1, хотя ударение по-прежнему делается на разборе примеров законченных, полезных программ, аненаотдельныхфрагментах. В главе 2 обсуждаются основные типы данных, операторы и выражения. В главе 3 рассматриваются управляющие операторы: IF-ELSE, WHILE, FOR и т.д. Глава 4 охватывает функции и структуру программы внешние переменные, правила


12 Б.В. Керниган, Д.М. Ричи. Язык С. 12 определенных областей действия описания и т.д. Вглаве5 обсуждаются указатели и адресная арифметика. Глава 6 содержит подробное описание структур и объединений. В главе 7 описывается стандартная библиотека ввода-вывода языка "C", которая обеспечивает стандартный интерфейс с операционной системой. Эта библиотека ввода-вывода поддерживается на всех машинах, на которых реализован "C", так что программы, использующие ее для ввода, вывода и других системных функций, могут переноситься с одной системы на другую по существу без изменений. Вглаве8 описывается интерфейс между "C" программами и операционной системой "UNIX". Упор делается на ввод-вывод, систему файлов и переносимость. Хотя некоторые части этой главы специфичны для операционной системы "UNIX", программисты, не использующие "UNIX", все же должны найти здесь полезный материал, в том числе некоторое представление о том, как реализована одна версия стандартной библиотеки и предложения для достижения переносимости программы. Приложение A содержит справочное руководство по языку "C". Оно является "официальным" изложением синтаксиса и семантики "C" и (исключая чей-либо собственный компилятор) окончательным арбитром для всех двусмысленностей и упущений в предыдущих главах. Так как "C" является развивающимся языком, реализованным на множестве систем, часть материла настоящей книги может не соответствовать текущему состоянию разработки на какой-то конкретной системе. Мы старались избегать таких проблем и предостерегать о возможных трудностях. Всомнительныхслучаях, однако, мы обычно предпочитали описывать ситуацию для системы "UNIX" PDP-11, так как она является средой для большинства программирующих на языке "C". В приложении а также описаны расхождения в реализациях языка "C" на основных системах. 1. Учебное введение Давайте начнем с быстрого введения в язык "C". Наша цель продемонстрировать существенные элементы языка на реальных программах, не увязая при этом в деталях, формальных правилах и исключениях. Вэтойглавемыне пытаемся изложить язык полностью или хотя бы строго (разумеется, приводимые примеры будут корректными). Мы хотим как можно скорее довести вас до такого уровня, на котором вы были бы в состоянии писать полезные программы, и чтобы добиться этого, мы сосредотачиваемся на основном: переменных и константах, арифметике, операторах передачи управления, функциях и элементарных сведениях о вводе и выводе. Мы совершенно намеренно оставляем за пределами этой главы многие элементы языка "C", которые имеют первостепенное значение при написании больших программ, втомчислеуказатели, сртуктуры, большую часть из богатого набора операторов языка "C", несколько операторов передачи управления и несметное количество деталей. Такой подход имеет, конечно, свои недостатки. Самым существенным является то, что полное описание любого конкретного элемента языка не излагается в одном месте, а пояснения, в силу краткости, могут привести к неправильному истолкованию. Кроме того, из-за невозможности использовать всю мощь языка, примеры оказываются не столь краткими и элегантными, как они могли бы быть. И хотя мы старались свести эти недостатки к минимуму, всежеимейтеихввиду. Другой недостаток состоит в том, что последующие главы будут неизбежно повторять некоторые части этой главы. Мы надеемся, что такое повторение будет скорее помогать, чем раздражать.


13 Б.В. Керниган, Д.М. Ричи. Язык С. 13 Во всяком случае, опытные программисты должны оказаться в состоянии проэкстраполировать материал данной главы на свои собственные программистские нужды. Начинающие же должны в дополнение писать аналогичные маленькие самостоятельные программы. И те, и другие могут использовать эту главу как каркас, на который будут навешиваться более подробные описания, начинающиеся сглавы 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"-программа, каков бы ни был ее размер, состоит из одной или более "функций", указывающих


14 Б.В. Керниган, Д.М. Ричи. Язык С. 14 фактические операции компьютера, которые должны быть выполнены. Функции в языке "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 не обеспечивает автоматического перехода на новую строку, так что многократное обращение к ней можно использовать для поэтапной сборки выходной строки. Наша первая программа, печатающая идентичную выдачу, с точно таким же успехом могла бы быть написана в виде


15 Б.В. Керниган, Д.М. Ричи. Язык С. 15 MAIN() PRINTF("HELLO, "); PRINTF("WORLD"); PRINTF("\N"); Подчеркнем, что \N представляет только один символ. Условные "последовательности", подобные \N, дают общий и допускающий расширение механизм для представления трудных для печати или невидимых символов. Среди прочих символов в языке "C" предусмотрены следующие: \т для табуляции, \B для возврата на одну позицию, \" для двойной кавычки и \\ для самой обратной косой черты. Упражнение 1-2. Проведите эксперименты для того, чтобы узнать что произойдет, если в строке, являющейся аргументом функции PRINTF будет содержаться \X, где X некоторый символ, не входящий в вышеприведенный список Переменные и арифметика Следующая программа печатает приведенную ниже таблицу температур по Фаренгейту и их эквивалентов по стоградусной шкале Цельсия, используя для перевода формулу C = (5/9)*(F-32) Теперь сама программа: /* PRINT FAHRENHEIT-CELSIUS TABLE FOR F = 0, 20,..., 300 */ MAIN() INT LOWER, UPPER, STEP; FLOAT FAHR, CELSIUS; LOWER = 0; /* LOWER LIMIT OF TEMPERATURE TABLE */


16 Б.В. Керниган, Д.М. Ричи. Язык С. 16 UPPER =300; /* UPPER LIMIT */ STEP = 20; /* STEP SIZE */ FAHR = LOWER; WHILE (FAHR <= UPPER) CELSIUS = (5.0/9.0) * (FAHR -32.0); PRINTF("% 4.0F %6.1F\N", FAHR, CELSIUS); FAHR = FAHR + STEP; Первые две строки /* PRINT FAHRENHEIT-CELSIUS TABLE FOR F = 0, 20,..., 300 */ являются комментарием, который в данном случае кратко поясняет, что делает программа. Любые символы между /* и */ игнорируются компилятором; можно свободно пользоваться комментариями для облегчения понимания программы. Комментарии могут появляться в любом месте, где возможен пробел или переход на новую строку. Вязыке"C" все переменные должны быть описаны до их использования, обычно это делается в начале функции до первого выполняемого оператора. Если вы забудете вставить описание, то получите диагностическое сообщение от компилятора. Описание состоит из типа и списка переменных, имеющих этот тип, как в INT LOWER, UPPER, STEP; FLOAT FAHR, CELSIUS; Тип INT означает, что все переменные списка целые; тип FLOAT предназначен для чисел с плавающей точкой, т.е. для чисел, которые могут иметь дробную часть. Точность как INT, TAK и FLOAT зависит от конкретной машины, на которой вы работаете. На PDP-11, например, тип INT соответствует 16-битовому числу со знаком, т.е. числу, лежащему между и Число типа FLOAT это 32-битовое число, имеющее около семи значащих цифр и лежащее в диапазоне от 10е-38 до 10е+38. Вглаве2 приводится список размеров для других машин. Вязыке"C" предусмотрено несколько других основных типов данных, кроме INT и FLOAT: CHAR символ один байт SHORT короткое целое LONG длинное целое DOUBLE плавающее с двойной точностью Размеры этих объектов тоже машинно-независимы; детали приведены в главе 2. Имеются также массивы, структуры и объединения этих основных типов, указатели на них и функции,которые их возвращают; со всеми ними мы встретимся в свое время.


17 Б.В. Керниган, Д.М. Ричи. Язык С. 17 Фактически вычисления в программе перевода температур начинаются с операторов присваивания LOWER = 0; UPPER =300; STEP = 20; FAHR =LOWER; которые придают переменным их начальные значения. каждый отдельный оператор заканчивается точкой с запятой. Каждая строка таблицы вычисляется одинаковым образом, так что мы используем цикл, повторяющийся один раз на строку. В этом назначение оператора WHILE: WHILE (FAHR <= UPPER)... проверяется условие в круглых скобках. Если оно истинно (FAHR меньше или равно UPPER), то выполняется тело цикла (все операторы, заключенные в фигурные скобки и). Затем вновь проверяется это условие и, если оно истинно, опять выполняется тело цикла. Если же условие не выполняется (FAHRпревосходит UPPER), цикл заканчивается и происходит переход к выполнению оператора, следующего за оператором цикла. Так как в настоящей программе нет никаких последующих операторов, то выполнение программы завершается. Тело оператора WHILE может состоять из одного или более операторов, заключенных в фигурные скобки, как в программе перевода температур, или из одного оператора без скобок, как, например, в WHILE (I < J) I=2*I; В обоих случаях операторы, управляемые оператором WHILE, сдвинуты на одну табуляцию, чтобы вы могли с первого взгляда видеть, какие операторы находятся внутри цикла. Такой сдвиг подчеркивает логическую структуру программы. Хотя в языке "C" допускается совершенно произвольное расположение операторов в строке, подходящий сдвиг и использование пробелов значительно облегчают чтение программ. Мы рекомендуем писать только один оператор на строке и (обычно) оставлять пробелы вокруг операторов. Расположение фигурных скобок менее существенно; мы выбрали один из нескольких популярных стилей. Выберите подходящий для вас стиль и затем используйте его последовательно. Основная часть работы выполняется в теле цикла. Температура по Цельсию вычисляется и присваивается переменной CELAIUS оператором CELSIUS = (5.0/9.0) * (FAHR-32.0);

18 Б.В. Керниган, Д.М. Ричи. Язык С. 18 причина использования выражения 5.0/9.0 вместо выглядящего проще 5/9 заключается в том, что в языке "C", как и во многих других языках, при делении целых происходит усечение, состоящее в отбрасывании дробной части результата. Таким образом, результат операции 5/9 равен нулю, и, конечно, вэтом случае все температуры оказались бы равными нулю. Десятичная точка в константе указывает, что она имеет тип с плавающей точкой, так что, как мы и хотели, 5.0/9.0 равно Мы также писали 32.0 вместо 32, несмотря на то, что так как переменная FAHR имеет тип FLOAT, целое 32 автоматически бы преобразовалось к типу FLOAT (в 32.0) перед вычитанием. С точки зрения стиля разумно писать плавающие константы с явной десятичной точкой даже тогда, когда они имеют целые значения; это подчеркивает их плавающую природу для просматривающего программу и обеспечивает то, что компилятор будет смотреть на вещи так же, как и Вы. Подробные правила о том, в каком случае целые преобразуются к типу с плаваюшей точкой, приведены в главе 2. Сейчас же отметим, что присваивание проверка FAHR = LOWER; WHILE (FAHR <= UPPER) работают, как ожидается, перед выполнением операций целые преобразуются в плавающую форму. Этот же пример сообщает чуть больше о том, как работает PRINTF. Функция PRINTF фактически является универсальной функцией форматных преобразований, которая будет полностью описана в главе 7. Ее первым аргументом является строка символов, которая должна быть напечатана, причем каждый знак % указывает, куда должен подставляться каждый из остальных аргументов /второй, третий,.../ и в какой форме он должен печататься. Например, воператоре PRINTF("%4.0F % 6.1F\N", FAHR, CELSIUS); спецификация преобразования %4.0F говорит, что число с плавающей точкой должно быть напечатано в поле шириной по крайней мере в четыре символа без цифр после десятичной точки. спецификация %6.1F описывает другое число, которое должно занимать по крайней мере шесть позиций с одной цифрой после десятичной точки, аналогично спецификациям F6.1 в фортране или F(6,1) в PL/1. Различные части спецификации могут быть опущены: спецификация %6F говорит, что число будет шириной по крайней мере в шесть символов; спецификация %2 требует двух позиций после десятичной точки, но ширина при этом не ограничивается; спецификация %F говорит только о том, что нужно напечатать число с плавающей точкой. Функция PRINTF также распознает следующие спецификации: %D для десятичного целого, %о для восьмеричного числа, %х для шестнадцатиричного, %с для символа, %S для символьной строки и %% - для самого символа %. Каждая конструкция с символом % в первом аргументе функции PRINTF сочетается с соответствующим вторым, третьим, и т.д. Аргументами; они должны


19 Б.В. Керниган, Д.М. Ричи. Язык С. 19 согласовываться по числу и типу; в противном случае вы получите бессмысленные результаты. Между прочим, функция PRINTF не является частью языка "C"; всамомязыке "C" не определены операции ввода-вывода. Нет ничего таинственного и в функции PRINTF ; это просто полезная функция, являющаяся частью стандартной библиотеки подпрограмм, которая обычно доступна "C"-программам. Чтобы сосредоточиться на самом языке, мы не будем подробно останавливаться на операциях ввода-вывода до главы 7. Вчастности, мы до тех пор отложим форматный ввод. Если вам надо ввести числа прочитайте описание функции SCANF вглаве7, раздел 7.4. Функция SCANF во многом сходна с PRINTF, но она считывает входные данные, анепечатаетвыходные. Упражнение 1-3. Преобразуйте программу перевода температур таким образом, чтобы она печатала заголовок к таблице. Упражнение 1-4. Напишите программы печати соответствующей таблицы перехода от градусов цельсия к градусам фаренгейта Оператор FOR Как и можно было ожидать, имеется множество различных способов написания каждой программы. Давайте рассмотрим такой вариант программы перевода температур: MAIN() /* FAHRENHEIT-CELSIUS TABLE */ INT FAHR; FOR(FAHR=0;FAHR<=300;FAHR=FAHR+20) PRINTF("%4D %6.1F\N", FAHR, (5.0/9.0)*(FAHR-32.0)); Эта программа выдает те же самые результаты, но выглядит безусловно подругому. Главное изменение исключение большинства переменных; осталась только переменная FAHR, причем типа INT (это сделано для того, чтобы продемонстрировать преобразование %D вфункцииprintf). Нижняя и верхняя границы и размер щага появляются только как константы в операторе FOR, который сам является новой конструкцией, а выражение, вычисляющее температуру по цельсию, входит теперь в виде третьего аргумента функции PRINTF, а не в виде отдельного оператора присваивания. Последнее изменение является примером вполне общего правила языка "C" в любом контексте, в котором допускается использование значения переменной некоторого типа, вы можете использовать выражение этого типа. Так как третий аргумент функции PRINTF должен иметь значение с плавающей точкой, чтобы соответствовать спецификации %6.1F, то в этом месте может встретиться любое выражение плавающего типа. Сам оператор FOR это оператор цикла, обобщающий оператор WHILE. Его функционирование должно стать ясным, если вы сравните его с ранее описанным


20 Б.В. Керниган, Д.М. Ричи. Язык С. 20 оператором WHILE. Оператор FOR содержит три части, разделяемые запятой. Первая часть точкой с FAHR = 0 выполняется один раз перед входом в сам цикл. Вторая часть - проверка, или условие, которое управляет циклом: FAHR <= 300 это условие проверяется и, если оно истинно, то выполняется тело цикла (в данном случае только функция PRINTF). Затем выполняется шаг реинициализации FAHR =FAHR + 20 и условие проверяется снова. цикл завершается, когда это условие становится ложным. Так же, как и в случае оператора WHILE, тело цикла может состоять из одного оператора или из группы операторов, заключенных в фигурные скобки. Инициализирующая и реинициализирующая части могут быть любыми отдельными выражениями. Выбор между операторами WHILE и FOR произволен и основывается на том, что выглядит яснее. Оператор FOR обычно удобен для циклов, в которых инициализация и реинициализация логически связаны и каждая задается одним оператором, так как в этом случае запись более компактна, чем при использовании оператора WHILE, а операторы управления циклом сосредотачиваются вместе в одном месте. Упражнение 1-5. Модифицируйте программу перевода температур таким образом, чтобы она печатала таблицу в обратном порядке, т.е. От 300 градусов до Символические константы Последнее замечание, прежде чем мы навсегда оставим программу перевода температур. Прятать "магические числа", такие как 300 и 20, внутрь программы это неудачная практика; они дают мало информации тем, кто, возможно, должен будет разбираться в этой программе позднее, и их трудно изменять систематическим образом. К счастью в языке "C" предусмотрен способ, позволяющий избежать таких "магических чисел". Используя конструкцию #DEFINE, вы можете в начале программы определить символическое имя или символическую константу, которая будет конкретной строкой символов. Впоследствии компилятор заменит все не заключенные в кавычки появления этого имени на соответствующую строку. Фактически это имя может быть заменено абсолютно произвольным текстом, не обязательно цифрами #DEFINE LOWER 0/* LOWER LIMIT OF TABLE */ #DEFINE UPPER 300 /* UPPER LIMIT */ #DEFINE STEP 20 /* STEP SIZE */



Лекция 2 Рыбалка С.А., Шкатова Г.И. Лекции по C++ Основные типы данных Основным средством хранения данных, обрабатываемых программой, являются ячейки памяти. Вся память компьютера является однородной и

1 Занятие 5 1.1 Перечислимые типы Язык Си имеет средства для определения перечислимых типов. В общем виде объявление перечислимых типов выглядит следующим образом: например, enum {

Лабораторная работа 1 Цель работы: Научиться работать с основными синтаксическими конструкциями языка Си. Уметь организовывать циклы, выполнять вычисления. 1. ТЕОРЕТИЧЕСКАЯ ЧАСТЬ 1.1. Переменные и их типы

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ ДЕРЖАВНИЙ ВИЩИЙ НАВЧАЛЬНИЙ ЗАКЛАД «ЗАПОРІЗЬКИЙ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ» Спеціальність 6.040302 Інформатика Дисципліна «Програмування» Підсумкова модульна контрольна

Урок 2 Курс: «Разработка приложений под мобильные устройства на основе Android» Тема: Переменные, типы данных, операторы План 1. Типы данных 2. Переменные. Константы и литералы 3. Операторы 1. Понятие

Целые числа. Битовые операции Шокуров Антон В. [email protected] 16 февраля 2017 г. Версия: 0.12 Аннотация Целые числа имеют свою специфику. Используются в целочисленной арифметике, а также для

Object Pascal Алфавит языка Лексическая структура языка Ячейка Значение Константа Переменная Операторы присваивания Система типов Арифметические выражения Логические выражения Строковые выражения Object

Тема 5. Структура программы, выражения, операции, операторы 5.1. Структура программы. Программы в среде разработки Delphi строятся на принципах модульной компоновки. Модуль это автономно компилируемая

Лабораторная работа 3 Тема: Структура программы на Си. Функции ввода-вывода. Ход выполнения лабораторной работы должен быть отражен в отчете. Отчет должен содержать титульный лист, номера задания, коды

Аналитический отчет по результатам ЕГЭ Информатика и ИКТ по Краснодарскому краю 2014г. Рекомендации на 2015г. Общие результаты ЕГЭ по Информатике и ИКТ в 2014г. Территория Процент выпускников, не преодолевших

46 В.Л. Тарасов Лекции по программированию на C++ Лекция 3 Структура программ, управление 3.1. Состав программы Программа на языке C++ состоит из функций и переменных. Среди функций любой программы должна

Лабораторная работа 3 Программирование циклических алгоритмов Цель работы: закрепить практические навыки работы с системой Microsoft Visual Studio 2010, научиться правильно использовать различные операторы

СОДЕРЖАНИЕ ВВЕДЕНИЕ 15 Новый подход к программированию на C++ 15 Наша книга полезна как для новичков, так и для опытных программистов 15 Абстракция 16 Охват материала 16 Несколько слов для опытных C- и

Ñîäåðæàíèå Введение 16 О чем эта книга 16 Прилагаемый компакт-диск 16 Что такое C++ 17 Соглашения, используемые в книге 17 Как организована эта книга 18 И еще... 18 Часть I. Первое знакомство с C++ 18

Глава 2. Управляющие операторы языка В теории программирования доказано, что программу для решения задачи любой сложности можно составить только из трех структур, называемых следованием, ветвлением и циклом.

Тема 1.3 Операции в С Преобразование типов явное и неявное. Операции арифметического типа. Преобразование типа в операции присвоения. Операции логического типа. Одноместные и двуместные операции. Адресные

ЛЕКЦИЯ 4. ТИПЫ ДАННЫХ Общие сведения о типах... 1 Отсутствие объявлений типов переменных... 2 Автоматическое преобразование типов... 3 Простые типы... 3 Целые числа... 3 Числа с плавающей точкой двойной

1 Занятие 7 1.1 Вычисление выражений Рассмотрим некоторые особенности вычисления выражений в языке Си. 1.1.1 Преобразования типов при вычислении выражений Перед вычислением арифметических операций транслятор

Содержание ПРЕДИСЛОВИЕ... 6 Глава 1 БАЗОВЫЕ ПОНЯТИЯ ЯЗЫКА... 10 1.1. Алфавит, идентификаторы, служебные слова... 11 1.2. Литералы... 14 1.3. Переменные и именованные константы... 21 1.4. Операции... 30

Тема: знакомство с С (Си) SWITCH, BREAK, FOR, WHILE, DO WHILE, CONTINUE, упражнения Содержание: SWITCH BREAK FOR WHILE DO WHILE CONTINUE упражнения Оператор SWITCH Оператор switch предназначен для организации

Тема 1.1 Базовые типы и агрегаты данных в языке «С» В языке программирования С присутствуют следующие типы данных: Тип Типичный размер в битах Минимально допустимый диапозон значений char 8 от -127 до

Http://compscicenter.ru 1/21 Лекция 2. Как выполняются программы на C++ Александр Смаль CS центр 15 сентября 2016 Санкт-Петербург http://compscicenter.ru 2/21 Типы данных Целочисленные: 1. char (символьный

8. * Структурное программирование 8.1. Общие сведения о структурном программировании 8.1.1. Программа и подпрограмма Программирование интенсивно развивается с середины прошлого века, формируясь в сферу

Лабораторная работа 7 Строки в С/С++ 1. Цель работы: 1) Получение практических навыков при работе со строками 2) Получение практических навыков при передаче строк в функции. 2. Краткие теоретические сведения

Технологии программирования Зима-Весна Лекция 9 Терновой Максим Юрьевич к.т.н., с.н.с., доцент кафедры информационнотелекоммуникационных сетей Вопросы, рассматриваемые на лекции 1. Частные (private) элементы

2.5.3 Операторы В языке Java предусмотрен обширный ряд операторов, предоставляющих программисту возможность полного контроля над построением и вычислением выражений. Большинство операторов относится к

Тема 1.1 Массивы скалярных данных Массивы в С++ Массив это структура данных, представленная в виде группы ячеек одного типа, объединенных под одним единым именем. Массивы используются для обработки большого

Практическое занятие Тема: Среда программирования. Цель работы: Изучить различные типы данных языка Pascal и оператор присваивания, научится создавать простейшие программы для реализации линейного алгоритма.

Статья взята из итернета гдето на Радиокоте Данная статья была мною написана для облегчения задачи тем, кто решил начать освоить приемы работы с популярными LCD на контролере HD44780. Работал я с «живым»

ФГОБУ ВПО "СибГУТИ" Кафедра вычислительных систем ПРОГРАММИРОВАНИЕ ЯЗЫКИ ПРОГРАММИРОВАНИЯ Массивы данных Преподаватель: Доцент Кафедры ВС, к.т.н. Поляков Артем Юрьевич Кафедра вычислительных систем ФГОБУ

ЛЕКЦИЯ 5. УСЛОВНЫЕ ОПЕРАТОРЫ (ОПЕРАТОРЫ ВЕТВЛЕНИЯ) Логические операции... 1 Операции сравнения... 3 Приоритет операций... 5 Инструкция if - else... 5 Синтаксис инструкции if:... 5 Тернарный оператор?:...

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

Денисова Э. В., Раков С. В. Программирование на языке СИ СПб; СПб ГИТМО (ТУ), 2003. 74с. В пособии даются базовые сведения для программирования на алгоритмическом языке СИ. Большое количество примеров

ВАРІАНТ 1 1. Операторы описания типов данных, констант и пользовательских типов данных в системах программирования на языке BASIC и FORTRAN. 2. Написать программу поиска среднего значения элементов заданного

ЛАБОРАТОРНАЯ РАБОТА 3. НАПИСАНИЕ СЦЕНАРИЕВ BASH. ЦЕЛЬ РАБОТЫ Практическое знакомство с интерпретатором сценариев Bash. Основной синтаксис языка сценария. СЦЕНАРИИ BASH Параметры и переменные Понятие параметра

Лабораторная работа 0 Алгоритмы циклической структуры Цель работы: получение практических навыков в построения алгоритмов циклической структуры средствами языка C. Содержание Краткие теоретические сведения...

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ Государственное автономное образовательное учреждение высшего образования «НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ ТОМСКИЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ» Общие

Состояние процессов Предположим, что программа была заранее собрана в некий единый самодостаточный объект, называемый загрузочным модулем. В ряде ОС программа собирается в момент загрузки из большого числа

Лекция 4 Операторы в JAVA Ввод информации с клавиатуры Проще всего вводить числа с клавиатуры, пользуясь классом Scanner. Этот класс принадлежит пакету java.util. Следовательно, чтобы использовать его

2 ВВЕДЕНИЕ В VISUAL BASIC FOR APPLICATIONS Информатика 2 семестр План лекции 1. Макросы и язык VBA 2. Объектно-ориентированные аспекты VBA 3. Переменные и типы данных 4. Ветвления 5. Циклы 6. Функции 7.

Тема 9. Типы. Структурированные типы. В Object Pascal четыре структурированных типа: массивы, записи, множества и файлы. Любой из структурированных типов характеризуется множественностью образующих этот

Операционная система Linux Лекция 10 Язык обработки данных AWK AWK (читается «оук») - интерпретируемый скриптовый C-подобный язык построчного разбора и обработки входного потока (например, текстового файла)

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ Федеральное государственное бюджетное образовательное учреждение высшего образования «Саратовский государственный технический университет имени Гагарина

Лекция 2 Разветвляющиеся алгоритмы. Циклические алгоритмы. Выражения Программирование, численные методы и информатика Александр Валерьевич Позднеев Кафедра автоматизации научных исследований Факультет

Лабораторная работа 2 Программирование разветвляющихся алгоритмов Цель работы: научиться правильно использовать условный оператор if; научиться составлять программы решения задач на разветвляющиеся алгоритмы.

Распределение памяти Распределение памяти - это процесс, в результате которого отдельным элементам исходной программы ставятся в соответствие адрес, размер и атрибуты области памяти, необходимой для размещения

Языки программирования и методы трансляции Введение 1 Спектр языков программирования 2 Наибольший общий делитель Сначала программы писали так: Пример (Программа вычисления н.о.д. для x86) 55 89 e5 53 83

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ Государственное автономное образовательное учреждение высшего образования «НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ ТОМСКИЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ» Учебно-методические

Лабораторная работа 3. Подпрограммы и стек. Командный цикл процессора. Цель: Реализация подпрограмм. Исследование работы микрокоманд. Подпрограммы и стек Часть 1. В программировании часто встречаются ситуации,

3. Влияние архитектуры Структура компьютера 1. Данные; 2. Элементарные операции; 3. Управление последовательностью действий; 4. Доступ к данным; 5. Управление памятью; 6. Операционная среда. 2 Данные Хранение:

Цель работы Лабораторная работа 7 ОСНОВЫ НАПИСАНИЯ СКРИПТОВ НА BASH Получить начальные практические навыки написания сценариев оболочки. 1. Теоретические сведения 1.1. Группирование команд. Скрипты Командная

Деннис Ритчи - это человек создавший очень популярный язык программирования - "C", или как его еще называют - "Отец языка программирования С". Деннис родился 9 сентября 1941 года в Бронксвиле, штат Нью-Йорк. Его отец Алистер Ритчи работал системным инженером в Bell Labalatories.

Немного позже Ритчи с семьей переехали в Нью-Джерси, окончил высшую школу Саммита, затем получил степень бакалавра в Гарвардском университете, в области физики и математики в 1963, а потом Доктора философии математики в 1968.

Деннис - один из ключевых разработчиков ядра Unix, а также соавтор книги "Денис Ритчи Язык программирования С". Он работал с Кеном Томсоном, человеком, который написал оригинальный Unix. Позже он работал над языком Си вместе с Брайеном Керниганом, их вместе еще называли K & R - Керниган и Ритчи. Денис сделал очень большой вклад в Unix. Особенно в то, что Unix была портирована для различных платформ. Его идеи до сих пор живут в центре дизайна операционных систем практически во всех новых языках программирования и в каждом бите информации.

Карьера Ритчи

Деннис Ритчи начал свою карьеру в 1967 году - Bell Laboratories, центре вычислительных исследований. Это один из самых известных центров цифровых инноваций в мире, а также место где родился транзистор.

Джон Ким, президент Alcatel-Lucent Bell Labs, говорил:

Деннис хорошо относился к своим коллегам в Bell Labs, и нам его будет очень не хватать. Он по-настоящему вдохновлял всех нас. Не только своими многочисленными достижениями, а еще и потому что он был другом, изобретателем, скромным и милым человеком. Мы хотели бы выразить глубочайшие соболезнования семье Ритчи и всем кто каким-либо образом был с ним связан.

Unix

В Bell Labs Ритчи работал над проектом Multics. Эта то была операционная система, которая должна была совместить идею пакетной обработки и интерактивности. Программа запускалась из карточного стека, и программист, оператор или сам пользователь имел полный контроль над выполнением программы. Тогда Денис встретил Кена Томсона, который позже станет одним из главных сотрудников Ритчи:

Одной из очевидных вещей почему коммерческий успех Multics не состоялся было то что она очень сложна. В ней было слишком много всего - Деннис Ритчи

Вскоре Bell Labs перестали работать над Multics, но Ритчи и Кен решили не отказываться от идеи взаимодействия с пользователем, и начали работать над его приемником - Unix. Теперь это современная операционная система, ее распространение началось в 1973 году.

Язык программирования Си

Разнообразие компьютерных платформ семидесятых годов плохо отразилось на жизни создателей программного обеспечения. Им нужно было либо тратить время и энергию на создание своего программного обеспечения для различных новых платформ, либо ограничить свои программы работой только на одной платформе.

Оригинальное ядро Unix было написано на ассемблере, но Ритчи и Кен решили, что им нужен язык высокого уровня, чтобы получить больше контроля над всеми данными и операционной системой.

Они использовали BCPL (Basic Combined Programming Language) чтобы написать UNIX, сжали его до восьми килобайт и переименовали в B.

Потом Ритчи пошел еще дальше и разработал новый язык программирования, называемый С. Это была модернизация языка B, добавившая типы данных и новый синтаксис. B был интерпретируемым языком, для его выполнения была необходима прослойка между процессором и командами языка, Си же компилируемый. Он сначала переводится в машинный код, а затем уже выполняется непосредственно процессором.

UNIX - простая операционная система, но вы должны быть гением чтобы понять ее простоту. - Деннис Ритчи

Программы, написанные на С могли легко и быстро переносится на другие платформы, на которых может работать Си. Си имел очень простой синтаксис и небольшое количество инструкций, а также модульную структуру. Из-за этого его было легко использовать на разных компьютерах. Существовали огромные блоки кода на Си, которые каждый разработчик мог скопировать и вставить в свою программу без необходимости все писать с нуля. Такие блоки кода были легко доступны с помощью библиотек, поэтому программисты могли очень быстро получить к ним доступ.

Ритчи и Кен переписали UNIX на Си, и это дало ему возможность переносимости, а также дало возможность программистам использовать одну операционную систему, один язык программирования и небольшой набор инструментов. Поэтому Unix позже и занял свое место операционной системы для экспериментов и создания сетей между компьютерами.

"Очевидно, что человек, который имел наибольшее влияние на мою карьеру это Кен Томпсон." - Деннис Ритчи

В 1978 году была издана книга Денниса Ритчи и Браена Кенигана - Язык программирования Си. Книга охватывает краткое введение в язык Си, а также различные техники и стили программирования. Эта книга остается практическим руководством для многих программистов до сих пор.

К середине 1980 язык Си стал одним из самых популярных языков программирования в мире. Из-за функциональности и скорости, с которой Си может быть легко использован для создания программного обеспечения и запуска его на различных платформах, многие компании начали использовать Си для разработки своих продуктов.

Язык программирования Си все еще используется в настоящее время как второй по популярности язык программирования в мире для создания прикладных систем, операционных систем, и развития встраиваемых систем. Его влияние все еще заметно во многих современных языках. Так же как и концепции UNIX сейчас считаются вычислительными заповедями.

"С уже был реализован для нескольких совершенно различных машин и операционных систем, UNIX уже распространяется на PDP-11, но переносимость всей системы была совершенно новой." - Денис Ритчи

Последний важный вклад, который сделал Деннис Ритчи в Unix, это механизм потоков, который используется для соединения устройств, приложений и протоколов.

Windows, Mac, Linux и...

Многочисленные приложения написаны на С или на его объективно ориентированном потомке С++. Си был стандартизирован ANSI и ISO, потому что на основе него сегодня строится почти каждый аспект информационной индустрии.

В качестве примера языков, которые были созданы позже на основе Си можно привести С++ или JavaScript, кроме того, браузеры написаны на Си. Microsoft Windows изначально была написана на Си, и даже обе операционных системы от Apple основаны на Unix.

Нет никаких сомнений, что вклад Денниса Ритчи значительно изменили ядро компьютерной индустрии.

Стиль программирования, который обеспечивается в Си, вероятно, будет использоваться все меньше и меньше. Но JavaScript и XML будут продолжать становиться все более важными. - Деннис Ритчи

Ричти позже стал руководителем департамента исследований компьютерных систем в Lucent Technologies и стремился сделать компьютеры проще и лучше для пользователей, вплоть до своего выхода на пенсию в 2007 году.

Награды

  • Награда АСМ за выдающиеся успехи в системах и языках в 1974 году.
  • Награда IEEE Emmanuel Piore в 1982
  • Награда сотруднику Bell Labs в 1984
  • Премия имени Тьюринга в 1983 году
  • Награда ACM Software Systems в 1983
  • Был номинирован Национальной академией инженеринга Соединенных Штатов Америки в 1963
  • Медаль IEEE Хэмминга в 1990.
  • Член музея компьютерной истории в 1997 году.
  • Национальная медаль Соединенных Штатов от президента Билла Клинтона за его работу над операционной системой UNIX и языком программирования C В апреле 1999 года.
  • Премия от Industrial Research Institute за его ценный вклад в науку и технологии в 2005 году.
  • Японская премия по информатизации и разработке UNIX в 2011 году.

Все награды, которые получил Деннис Ритчи также получил и Кен Томсон.

Смерть Ритчи

Деннис жил сам в своем доме в Беркли Хайтс штат Нью Джерси. Был найден мертвым 12 октября 2011 года. Причины и точное время смерти неизвестны. Последние несколько лет у него было слабое здоровье после лечения рака предстательной железы и сердечно сосудистых заболеваний.

Он умер через неделю после смерти Стива Джобса, но это не было так ярко освещено прессой. Релиз Fedora Linux 16 в 2012 году был посвящен памяти Денниса Ритчи.

Пол Крези, компьютерный историк, после смерти Ритчи сказал.

Brian W. Kernighan, Dennis M. Ritchie
The C programming Language
Second Edition
AT&T Bell Laboratories
Murray Hill, New Jersey
Prentice Hall PTR, Englewood Cliffs, New Jersey 07632
Б. Керниган, Д. Ритчи
Язык программирования Си
Издание 3-е, исправленное
Перевод с английского под редакцией Вс. С. Штаркмана
Невский Диалект, Санкт-Петербург 2001
УДК 681.3.06
ББК 24.4.9
К36
Перевод с английского Вик. С. Штаркмана, под редакцией Вс. С. Штаркмана.
Керниган Б., Ритчи Д.
К36 Язык программирования Си. \Пер. с англ., 3-е изд., испр. - СПб.: "Невский Диалект", 2001. - 352 с.: ил.
Книга широко известных авторов , разработчиков языка Си, переработанная и дополненная с учетом стандарта ANSI для языка Си, 2-е английское издание которой вышло в 1988 году, давно стала классикой для всех изучающих и/или использующих как Си, так и Си++. Русский перевод этой книги впервые был выпущен изд- вом "Финансы и статистика" в 1992 г. и с тех пор пользуется неизменным спросом читателей.
Для настоящего третьего русского издания перевод заново сверен с оригиналом, в него внесены некоторые поправки, учитывающие устоявшиеся за прошедшие годы изменения в терминологии, а так же учтены замечания, размещенные автором на странице http://cm.bell-labs.com/cm/cs/cbook/2ediffs.html
Для программистов, преподавателей и студентов.
Издание подготовлено при участии издательства "Финансы и статистика"
ISBN 5-7940-0045-7 © 1998, 1978 by Bell Telephone Laboratories, Incorporated
ISBN 0-13-110362-8 {PBK}
1

ISBN 0-13-110370-9 (англ.) © "Невский Диалект", 2001
Введение
Си - универсальный язык программирования. Он тесно связан с системой UNIX, так как был разработан в этой системе, которая как и большинство программ, работающих в ней, написаны на Си. Однако язык не привязан жестко к какой-то одной операционной системе или машине. Хотя он и назван "языком системного программирования", поскольку удобен для написания компиляторов и операционных систем, оказалось, что на нем столь же хорошо писать большие программы другого профиля.
Многие важные идеи Си взяты из языка BCPL, автором которого является Мартин Ричардс. Влияние
BCPL на Си было косвенным - через язык B, разработанный Кеном Томпсоном в 1970 г. для первой системы UNIX, реализованной на PDP-7.
BCPL и B - "бестиповые" языки. В отличие от них Си обеспечивает разнообразие типов данных. Базовыми типами являются символы, а также целые и числа с плавающей точкой различных размеров. Кроме того, имеется возможность получать целую иерархию производных типов данных из указателей, массивов, структур и объединений. Выражения формируются из операторов и операндов. Любое выражение, включая присваивание и вызов функции, может быть инструкцией. Указатели обеспечивают машинно- независимую адресную арифметику.
В Си имеются основные управляющие конструкции, используемые в хорошо структурированных программах: составная инструкция ({. . .}), ветвление по условию (if-else ), выбор одной альтернативы из многих (switch ), циклы с проверкой наверху (while , for ) и с проверкой внизу (do ), а также средство прерывания цикла (break ).
В качестве результата функции могут возвращать значения базовых типов, структур, объединений и указателей. Любая функция допускает рекурсивное обращение к себе. Как правило, локальные переменные функции - "автоматические", т. е. они создаются заново при каждом обращении к ней.
Определения функций нельзя вкладывать друг в друга, но объявления переменных разрешается строить в блочно-структурной манере. Функции программы на Си могут храниться в отдельных исходных файлах и компилироваться независимо. Переменные по отношению к функции могут быть внутренними и внешними. Последние могут быть доступными в пределах одного исходного файла или всей программы.
На этапе препроцессирования выполняется макроподстановка в текст программы, включение других исходных файлов и условная компиляция.
Си - язык сравнительно "низкого уровня". Однако это вовсе не умаляет его достоинств, просто Си имеет дело с теми же объектами, что и большинство компьютеров, т. е. с символами, числами и адресами. С ними можно оперировать при помощи арифметических и логических операций, выполняемых реальными машинами.
В Си нет прямых операций над составными объектами, такими как строки символов, множества, списки и массивы. В нем нет операций, которые бы манипулировали с целыми массивами или строками символов,
хотя структуры разрешается копировать целиком как единые объекты. В языке нет каких-либо средств распределения памяти, помимо возможности определения статических переменных и стекового механизма при выделении места для локальных переменных внутри функций. Нет в нем "кучи" и "сборщика мусора". Наконец, в самом Си нет средств ввода-вывода, инструкций READ (читать) и WRITE
(писать) и каких-либо методов доступа к файлам. Все это - механизмы высокого уровня, которые в Си обеспечиваются исключительно с помощью явно вызываемых функций. Большинство реализованных Си- систем содержат в себе разумный стандартный набор этих функций.
В продолжение сказанного следует отметить , что Си предоставляет средства лишь последовательного управления ходом вычислений: механизм ветвления по условиям, циклы, составные инструкции,
2

подпрограммы и не содержит средств мультипрограммирования, параллельных процессов, синхронизации и организации сопрограмм.
Отсутствие некоторых из перечисленных средств может показаться серьезным недостатком ("выходит, чтобы сравнить две строки символов, нужно обращаться к функции?"). Однако компактность языка имеет реальные выгоды. Поскольку Си относительно мал, то и описание его кратко, и овладеть им можно быстро. Программист может реально рассчитывать на то, что он будет знать, понимать и на практике регулярно пользоваться всеми возможностями языка.
В течение многих лет единственным определением языка Си было первое издание книги "Язык программирования Си". В 1983 г. Институтом американских национальных стандартов (ANSI) учреждается комитет для выработки современного исчерпывающего определения языка Си. Результатом его работы явился стандарт для Си ("ANSI-C"), выпущенный в 1988 г. Большинство положений этого стандарта уже учтено в современных компиляторах.
Стандарт базируется на первоначальном справочном руководстве. По сравнению с последним язык изменился относительно мало. Одной из целей стандарта было обеспечить, чтобы в большинстве случаев существующие программы оставались правильными или вызывали предупреждающие сообщения компиляторов об изменении поведения.
Для большинства программистов самое важное изменение - это новый синтаксис объявления и определения функций. Объявление функции может теперь включать и описание ее аргументов. В соответствии с этим изменился и синтаксис определения функции. Дополнительная информация значительно облегчает компилятору выявление ошибок, связанных с несогласованностью аргументов; по нашему мнению, это очень полезное добавление к языку.
Следует также отметить ряд небольших изменений. В языке узаконены присваивание структур и перечисления, которые уже некоторое время широко используются. Вычисления с плавающей точкой теперь допускаются и с одинарной точностью. Уточнены свойства арифметики, особенно для беззнаковых типов. Усовершенствован препроцессор. Большинство программистов эти изменения затронут очень слабо.
Второй значительный вклад стандарта - это определение библиотеки, поставляемой вместе с Си- компилятором, в которой специфицируются функции доступа к возможностям операционной системы
(например чтения-записи файлов), форматного ввода-вывода, динамического выделения памяти, манипуляций со строками символов и т. д. Набор стандартных заголовочных файлов обеспечивает единообразный доступ к объявлениям функций и типов данных. Гарантируется, что программы, использующие эту библиотеку при взаимодействии с операционной системой, будут работать также и на других машинах. Большинство программ, составляющих библиотеку, созданы по образу и подобию "стандартной библиотеки ввода-вывода" системы UNIX. Эта библиотека описана в первом издании книги и широко используется в других системах. И здесь программисты не заметят существенных различий. Так как типы данных и управляющих структур языка Си поддерживаются командами большинства существующих машин, исполнительная система (run-time library), обеспечивающая независимый запуск и выполнение программ, очень мала. Обращения к библиотечным функциям пишет сам программист (не компилятор), поэтому при желании их можно легко заменить на другие. Почти все программы, написанные на Си, если они не касаются каких-либо скрытых в операционной системе деталей, переносимы на другие машины.
Си соответствует аппаратным возможностям многих машин, однако он не привязан к архитектуре какой- либо конкретной машины. Проявляя некоторую дисциплину, можно легко писать переносимые программы , т. е. программы, которые без каких-либо изменений могут работать на разных машинах.
Стандарт предоставляет возможность для явного описания переносимости с помощью набора констант, отражающих характеристики машины, на которой программа будет работать.
Си не является "строго типизированным" языком, но в процессе его развития контроль за типами был усилен. В первой версии Си хоть не одобрялся, но разрешался бесконтрольный обмен указателей и целых, что вызывало большие нарекания, но это уже давным-давно запрещено. Согласно стандарту теперь требуется явное объявление или явное указание преобразования, что уже и реализовано в хороших компиляторах. Новый вид объявления функций - еще один шаг в этом направлении. Компилятор теперь предупреждает о большей части ошибок в типах и автоматически не выполняет преобразования
3

данных несовместимых типов. Однако основной философией Си остается то, что программисты сами знают, что делают; язык лишь требует явного указания об их намерениях.
Си, как и любой другой язык программирования, не свободен от недостатков. Уровень старшинства некоторых операторов не является общепринятым, некоторые синтаксические конструкции могли бы быть лучше. Тем не менее, как оказалось, Си - чрезвычайно эффективный и выразительный язык, пригодный для широкого класса задач.
Книга имеет следующую структуру.
Глава 1
представляет собой обзор основных средств языка Си. Ее назначение - побудить читателя по возможности быстрее приступить к программированию, так как мы убеждены, что единственный способ изучить новый язык - это писать на нем программы. Эта часть книги предполагает наличие знаний по основным элементам программирования. Никаких пояснений того, что такое компьютер, компиляция или что означает выражение вида n=n+1 не дается. Хотя мы и пытались там, где это возможно, показать полезные приемы программирования, эта книга не призвана быть справочником ни по работе со структурами данных, ни по алгоритмам: когда оказывалось необходимым выбрать, на что сделать ударение, мы предпочитали сконцентрировать внимание на языке.
В главах 2-6 различные средства языка обсуждаются более подробно и несколько более формально, чем в главе 1; при этом по-прежнему упор делается на примеры, являющиеся законченными программами, а не изолированными фрагментами.
Глава 2
знакомит с базовыми типами данных, с операторами и выражениями. В главе 3
рассматриваются средства управления последовательностью вычислений: if-
else , switch , while , for и т.д. В главе 4
речь идет о функциях и структуре программы (внешних переменных, правилах видимости, делении программы на несколько исходных файлов и т. д.), а также о препроцессоре. В главе 5
обсуждаются указатели и адресная арифметика.
Глава 6
посвящена структурам и объединениям.
В главе 7
описана стандартная библиотека, обеспечивающая общий интерфейс с операционной системой. Эта библиотека узаконена в качестве стандарта ANSI, иначе говоря, она должна быть представлена на всех машинах, где существует Си, благодаря чему программы , использующие ввод- вывод и другие возможности операционной системы, без каких-либо изменений можно переносить с одной машины на другую.
Глава 8
содержит описание интерфейса между программами на Си и операционной системой UNIX, в частности описание ввода-вывода, файловой системы и распределения памяти. Хотя некоторые параграфы этой главы отражают специфику системы UNIX, программисты, пользующиеся другими системами, все же найдут в них много полезных сведений, включая определенный взгляд на то, как реализуется одна из версий стандартной библиотеки, и некоторые предложения по переносимости программ.
Приложение A
является справочником по языку. Строгое определение синтаксиса и семантики языка Си содержится в официальном документе стандарта ANSI. Последний, однако, более всего подходит разработчикам компилятора. Наш справочник определяет язык более сжато, не прибегая к педантично юридическому стилю, которым пользуется стандарт.
Приложение B
- сводка по содержимому стандартной библиотеки и предназначена скорее пользователям, чем реализаторам. В приложении C
приводится краткий перечень отличий от первой версии языка. В сомнительных случаях, однако, окончательным судьей по языку остается стандарт и компилятор, которым вы пользуетесь.
Глава 1. Обзор языка
1.1 Начнем, пожалуй
1.2 Переменные и арифметические выражения
1.3 Инструкция
for
1.4 Именованные константы
4

1.5 Ввод-вывод символов
1.5.1 Копирование файла
1.5.2 Подсчет символов
1.5.3 Подсчет строк
1.5.4 Подсчет слов
1.6 Массивы
1.7 Функции
1.8 Аргументы. Вызов по значению
1.9 Символьные массивы
1.10 Внешние переменные и область видимости
Глава 2. Типы, операторы и выражения
2.1 Имена переменных
2.2 Типы и размеры данных
2.3 Константы
2.4 Объявления
2.5 Арифметические операторы
2.6 Операторы отношения и логические операторы
2.7 Преобразования типов
2.8 Операторы инкремента и декремента
2.9 Побитовые операторы
2.10 Операторы и выражения присваивания
2.11 Условные выражения
2.12 Приоритет и очередность вычислений
Глава 3. Управление
3.1 Инструкции и блоки
3.2 Конструкция
if-else
3.3 Конструкция
else-if
3.4 Переключатель
switch
3.5 Циклы
while
и
for
3.6 Цикл
do
- while
3.7 Инструкции
break
и
continue
3.8 Инструкция
goto
и метки
Глава 4. Функции и структура программы
4.1 Основные сведения о функциях
4.2 Функции, возвращающие нецелые значения
4.3 Внешние переменные
4.4 Области видимости
4.5 Заголовочные файлы
4.6 Статические переменные
4.7 Регистровые переменные
4.8 Блочная структура
4.9 Инициализация
4.10 Рекурсия
4.11 Препроцессор языка Си
4.11.1 Включение файла
5

4.11.2 Макроподстановка
4.11.3 Условная компиляция
Глава 5. Указатели и массивы
5.1 Указатели и адреса
5.2 Указатели и аргументы функций
5.3 Указатели и массивы
5.4 Адресная арифметика
5.5 Символьные указатели функции
5.6 Массивы указателей, указатели на указатели
5.7 Многомерные массивы
5.8 Инициализация массивов указателей
5.9 Указатели против многомерных массивов
5.10 Аргументы командной строки
5.11 Указатели на функции
5.12 Сложные объявления
Глава 6. Структуры
6.1 Основные сведения о структурах
6.2 Структуры и функции
6.3 Массивы структур
6.4 Указатели на структуры
6.5 Структуры со ссылками на себя
6.6 Просмотр таблиц
6.7 Средство typedef
6.8 Объединения
6.9 Битовые поля
Глава 7. Ввод и вывод
7.1 Стандартный ввод-вывод
7.2 Форматный вывод (
printf
7.3 Списки аргументов переменной длины
7.4 Форматный ввод (
scanf
7.5 Доступ к файлам
7.6 Управление ошибками (
stderr
и
exit
7.7 Ввод-вывод строк
7.8 Другие библиотечные функции
7.8.1 Операции со строками
7.8.2 Анализ класса символов и преобразование символов
7.8.3 Функция
ungetc
7.8.4 Исполнение команд операционной системы
7.8.5 Управление памятью
7.8.6 Математические функции
7.8.7 Генератор случайных чисел
6

Глава 8. Интерфейс с системой UNIX
8.1 Дескрипторы файлов
8.2 Нижний уровень ввода-вывода (read и write)
8.3 Системные вызовы open, creat, close, unlink
8.4 Произвольный доступ (lseek)
8.5 Пример. Реализация функций fopen и getc
8.6 Пример. Печать каталогов
8.7 Пример. Распределитель памяти
Приложение A. Справочное руководство
A1. Введение
A2. Соглашения о лексике
A2.1. Лексемы (
tokens
A2.2. Комментарий
A2.3. Идентификаторы
A2.4. Ключевые слова
A2.5. Константы
A2.5.1. Целые константы
A2.5.2. Символьные константы
А2.5.3. Константы с плавающей точкой
A2.5.4. Константы-перечисления
A2.6. Строковые литералы
A3. Нотация синтаксиса
A4. Что обозначают идентификаторы
A4.1. Класс памяти
A4.2. Базовые типы
A4.3. Производные типы
A4.4. Квалификаторы типов
A5. Объекты и Lvalues
A6. Преобразования
A6.1. Целочисленное повышение
A6.2. Целочисленные преобразования
A6.3. Целые и числа с плавающей точкой
A6.4. Типы с плавающей точкой
А6.5. Арифметические преобразования
A6.6. Указатели и целые
A6.7. Тип
void
А6.8. Указатели на
void
A7. Выражения
A7.1. Генерация указателя
A7.2. Первичные выражения
A7.3. Постфиксные выражения
A7.3.1. Обращение к элементам массива
A7.3.2. Вызов функции
A7.3.3. Обращение к структурам
7

A7.3.4. Постфиксные операторы инкремента и декремента
А7.4. Унарные операторы
А7.4.1. Префиксные операторы инкремента и декремента
A7.4.2. Оператор получения адреса
A7.4.3. Оператор косвенного доступа
A7.4.4. Оператор унарный плюс
A7.4.5. Оператор унарный минус
A7.4.6. Оператор побитового отрицания
A7.4.7. Оператор логического отрицания
A7.4.8. Оператор определения размера
sizeof
A7.5. Оператор приведения типа
A7.6. Мультипликативные операторы
A7.7. Аддитивные операторы
A7.8. Операторы сдвига
A7.9. Операторы отношения
A7.10. Операторы равенства
A7.11. Оператор побитового
И
A7.12. Оператор побитового исключающего
ИЛИ
A7.13. Оператор побитового
ИЛИ
A7.14. Оператор логического
И
A7.15. Оператор логического
ИЛИ
А7.16. Условный оператор
A7.17. Выражения присваивания
A7.18. Оператор запятая
A7.19. Константные выражения
A8. Объявления
A8.1. Спецификаторы класса памяти
А8.2. Спецификаторы типа
A8.3. Объявления структур и объединений
A8.4. Перечисления
А8.5. Объявители
A8.6. Что означают объявители
A8.6.1. Объявители указателей
А8.6.2. Объявители массивов
А8.6.3. Объявители функций
A8.7. Инициализация
A8.8. Имена типов
А8.9. Объявление
typedef
A8.10. Эквивалентность типов
A9. Инструкции
A9.1. Помеченные инструкции
A9.2. Инструкция-выражение
A9.3. Составная инструкция
A9.4. Инструкции выбора
A9.5. Циклические инструкции
A9.6. Инструкции перехода
А10. Внешние объявления
A10.1. Определение функции
A10.2. Внешние объявления
8

A11. Область видимости и связи
A11.1. Лексическая область видимости
A11.2. Связи
A12. Препроцессирование
A12.1. Трехзнаковые последовательности
A12.2. Склеивание строк
А12.3. Макроопределение и макрорасширение
A12.4. Включение файла
A12.5. Условная компиляция
A12.6. Нумерация строк
A12.7. Генерация сообщения об ошибке
A12.8. Прагма
A12.9. Пустая директива
A12.10. Заранее определенные имена
A13. Грамматика
Приложение B. Стандартная библиотека
B1. Ввод-вывод:

B1.1. Операции над файлами
B1.2. Форматный вывод
B1.3. Форматный ввод
B1.4. Функции ввода-вывода символов
B1.5. Функции прямого ввода-вывода
B1.6. Функции позиционирования файла
B1.7. Функции обработки ошибок
B2. Проверки класса символа:

B3. Функции, оперирующие со строками:

B4. Математические функции:

B5. Функции общего назначения:

B6. Диагностика:

B7. Списки аргументов переменной длины:

B8. Дальние переходы:

B9. Сигналы:

B10. Функции даты и времени:

B11. Зависящие от реализации пределы:

и

  • Сергей Савенков

    какой то “куцый” обзор… как будто спешили куда то