Керниган и Ритчи - Язык программирования Си (793773), страница 7
Текст из файла (страница 7)
В нашем примере main определена как функция, которая не ждетникаких аргументов, что отмечено пустым списком ().Первая программа на Си.#include <stdio.h>Включениебиблиотеке.main()Определение функции с именем main, не получающейникаких аргументов.{Инструкции main заключаются в фигурные скобки.printf ("здравствуй, мир\n");}информацииостандартнойФункция main вызывает библиотечную функциюprintf для печати заданной последовательностисимволов; \n — символ новой строки.Инструкции функции заключаются в фигурные скобки {}. Функция main содержит только одну инструкциюprintf ("здравствуй, мир\п");Функция вызывается по имени, после которого, в скобках, указывается список аргументов. Таким образом,приведенная выше строка — это вызов функции printf с аргументом "здравствуй, мир\n". Функцияprintf — это библиотечная функция, которая в данном случае напечатает последовательность символов,заключенную в двойные кавычки.Последовательность символов в двойных кавычках, такая как "здравствуй, мир\n", называется строкойсимволов, или строковой константой.
Пока что в качестве аргументов для printf и других функций мыбудем использовать только строки символов.В Си комбинация \n внутри строки символов обозначает символ новой строки и при печати вызываетпереход к левому краю следующей строки. Если вы удалите \n (стоит поэкспериментировать), то обнаружите,что, закончив печать, машина не переходит на новую строку. Символ новой строки в текстовый аргументprintf следует включать явным образом. Если вы попробуете выполнить, например,printf ("здравствуй, мир");компилятор выдаст сообщение об ошибке.Символ новой строки никогда не вставляется автоматически, так что одну строку можно напечатать по шагамс помощью нескольких обращений к printf.
Нашу первую программу можно написать и так:#include <stdio.h>main(){printf ("здравствуй, ");printf ("миp");printf ("\n");}В результате ее выполнения будет напечатана та же строка, что и раньше.Заметим, что \n обозначает только один символ. Такие особые комбинации символов, начинающиеся собратной наклонной черты, как \n, и называемые эскейп-последовательностями, широко применяются дляобозначения трудно представимых или невидимых символов. Среди прочих в Си имеются символы \t, \b,\", \\, обозначающие соответственно табуляцию, возврат на один символ назад ("забой" последнегосимвола), двойную кавычку, саму наклонную черту.
Полный список таких символов представлен в параграфе2.3.Упражнение 1.1. Выполните программу, печатающую "здравствуй, мир", в вашей системе.Поэкспериментируйте, удаляя некоторые части программы, и посмотрите, какие сообщения об ошибках выполучите.Упражнение 1.2. Выясните, что произойдет, если в строковую константу аргумента printf вставить \с, где с— символ, не входящий в представленный выше список.1.2.
Переменные и арифметические выраженияПриведенная ниже программа выполняет вычисления по формуле °С = (5/9) (Т-32) и печатает таблицусоответствия температур по Фаренгейту температурам по Цельсию:020406080100120140160-17-641526374860711802002202402602803008293104115126137148Как и предыдущая, эта программа состоит из определения одной-единственной функции main. Она длиннеепрограммы, печатающей "здравствуй, мир", но по сути не сложнее.
На ней мы продемонстрируем нескольконовых возможностей, включая комментарий, объявления, переменные, арифметические выражения, циклы иформатный вывод.#include <stdio.h>/* печать таблицы температур по Фаренгейтуи Цельсию для fahr = 0, 20, ..., 300 */main(){int fahr, celsius;int lower, upper, step;lower = 0; /* нижняя граница таблицы температур */upper = 300; /* верхняя граница */step = 20; /* шаг */fahr = lower;while (fahr <= upper) {celsius = 5 * (fahr-32) / 9;printf ("%d\t%d\n", fahr, celsius);fahr = fahr + step;}}Две строки:/* печать таблицы температур по Фаренгейтуи Цельсию для fahr = 0, 20, ..., 300 */являются комментарием, который в данном случае кратко объясняет, что делает программа.
Все символы,помещенные между /* и */, игнорируются компилятором, и этим можно свободно пользоваться, чтобысделать программу более понятной. Комментарий можно располагать в любом месте, где могут стоятьсимволы пробела, табуляции или символ новой строки.В Си любая переменная должна быть объявлена раньше, чем она будет использована; обычно всепеременные объявляются в начале функции перед первой исполняемой инструкцией.
В объявленииописываются свойства переменных. Оно состоит из названия типа и списка переменных, например:int fahr, celsius;int lower, upper, step;Тип int означает, что значения перечисленных переменных есть целые, в отличие от него тип floatуказывает на значения с плавающей точкой, т. е.
на числа, которые могут иметь дробную часть. Диапазонызначений обоих типов зависят от используемой машины.Числа типа int бывают как 16-разрядные (лежат в диапазоне от -32768 до 32767), так и 32-разрядные. Числатипа float обычно представляются 32-разрядными словами, имеющими по крайней мере 6 десятичныхзначащих цифр (лежат приблизительно в диапазоне от 10-38 до 1038).Помимо int и float в Си имеется еще несколько базовых типов для данных, это:char— символ — единичный байт;short— короткое целое;long— длинное целое;double— с плавающей точкой с двойной точностью.Размеры объектов указанных типов также зависят от машины.
Из базовых типов можно создавать: массивы,структуры и объединения, указатели на объекты базовых типов и функции, возвращающие значения этихтипов в качестве результата. Обо всем этом мы расскажем позже.Вычисления в программе преобразования температур начинаются с инструкций присваивания:lower = 0;upper = 300;step = 20;fahr = lower;которые устанавливают указанные в них переменные в начальные значения.
Любая инструкция заканчиваетсяточкой с запятой.Все строки таблицы вычисляются одним и тем же способом, поэтому мы воспользуемся циклом,повторяющим это вычисление для каждой строки. Необходимые действия выполнит цикл while:while (fahr <= upper) {Он работает следующим образом. Проверяется условие в скобках. Если оно истинно (значение fahr меньшеили равно значению upper), то выполняется тело цикла (три инструкции, заключенные в фигурные скобки).Затем опять проверяется условие, и если оно истинно, то тело цикла выполняется снова.
Когда условиестановится ложным (fahr превысило upper), цикл завершается, и вычисления продолжаются с инструкции,следующей за циклом. Поскольку никаких инструкций за циклом нет, программа завершает работу.Телом цикла while может быть одна или несколько инструкций, заключенных в фигурные скобки, как впрограмме преобразования температур, или одна-единственная инструкция без скобок, как в циклеwhile (i < j )i = 2 * i;И в том и в другом случае инструкции, находящиеся под управлением while, мы будем записывать сосдвигом, равным одной позиции табуляции, которая в программе указывается четырьмя пробелами;благодаря этому будут ясно видны инструкции, расположенные внутри цикла.
Отступы подчеркиваютлогическую структуру программы. Си-компилятор не обращает внимания на внешнее оформлениепрограммы, но наличие в нужных местах отступов и пробелов существенно влияет на то, насколько легко онабудет восприниматься человеком при просмотре. Чтобы лучше была видна логическая структура выражения,мы рекомендуем на каждой строке писать только по одной инструкции и с обеих сторон от операторовставить пробелы. Положение скобок не так важно, хотя существуют различные точки зрения на этот счет. Мыостановились на одном из нескольких распространенных стилей их применения.
Выберите тот, которыйбольше всего вам нравится, и строго ему следуйте.Большая часть вычислений выполняется в теле цикла. Температура по Фаренгейту переводится в температурупо Цельсию и присваивается переменной celsius посредством инструкцииcelsius = 5 * (fahr-32) / 9;Причина, по которой мы сначала умножаем на 5 и затем делим на 9, а не сразу умножаем на 5/9, связана стем, что в Си, как и во многих других языках, деление целых сопровождается отбрасыванием2, т. е.
потерейдробной части. Так как 5 и 9 — целые, отбрасывание в 5/9 дало бы нуль, и на месте температур по Цельсиюбыли бы напечатаны нули.Этот пример прибавил нам еще немного знаний о том, как работает функция printf. Функция printf —это универсальная функция форматного ввода-вывода, которая будет подробно описана в главе 7. Ее первыйаргумент — строка символов, в которой каждый символ % соответствует одному из последующих аргументов(второму, третьему,...), а информация, расположенная за символом %, указывает на вид, в котором выводитсякаждый из этих аргументов.
Например, %d специфицирует выдачу аргумента в виде целого десятичногочисла, и инструкцияprintf ("%d\t%d\n", fahr, celsius);печатает целое fahr , выполняет табуляцию (\t) и печатает целое celsius.В функции рrintf каждому спецификатору первого аргумента (конструкции, начинающейся с %)соответствует второй аргумент, третий аргумент и т. д. Спецификаторы и соответствующие им аргументыдолжны быть согласованы по количеству и типам: в противном случае напечатано будет не то, что нужно.Кстати, printf не является частью языка Си, и вообще в языке нет никаких специальных конструкций,определяющих ввод-вывод.















