Основы программирования

Глава 2
Индекс материала
Глава 2
Первый просмотр: краткий обзор
Второй просмотр: детали
Четыре довода в пользу объявления переменных
СТРУКТУРА ПРОСТОЙ ПРОГРАММЫ
НЕСКОЛЬКО СОВЕТОВ, КАК СДЕЛАТЬ ПРОГРАММУ ЧИТАЕМОЙ
СЛЕДУЮЩИЙ ШАГ
ДОПОЛНИТЕЛЬНЫЙ ПРИМЕР
ЧТО ВЫ ДОЛЖНЫ БЫЛИ УЗНАТЬ В ЭТОЙ ГЛАВЕ
УПРАЖНЕНИЯ
Все страницы

Введение в язык Си

СТРУКТУРА ПРОСТОЙ ПРОГРАММЫ
ОПИСАНИЕ ПЕРЕМЕННЫХ
ИСПОЛЬЗОВАНИЕ КОМЕНТАРИЕВ
ЧИТАЕМОСТЬ ПРОГРАММ
ОПЕРАЦИИ

Как выглядит программа, написанная на языке Си? Возможно, вы уже обратили внимание на пример, приведенный в гл. 1, и нашли, что эта программа выглядит довольно специфически из-за наличия в ней символов типа ( и \n". Когда вы прочтете данную книгу, вы обнаружите, что появление этих и Других характерных для языка Си символов станет менее странным, более понятным и, возможно, даже предпочтительным! Начало настоящей главы будет посвящено обсуждению довольно простого примера программы и объяснению того, что она делает. При этом мы рассмотрим некоторые из основных средств языка Си. Если какие-то детали остаются для вас неясными и вы захотите получить более подробные, ответы на возникшие вопросы, не огорчайтесь. Мы займемся этим в следующих главах. Давайте рассмотрим простую программу на языке Си. Следует сразу сказать, что такой пример нужен нам лишь для выявления некоторых основных черт любой программы, написанной на языке Си. Далее мы дадим пояснения к каждой строке, но, перед тем как вы с ними познакомитесь, просто взгляните на программу и попробуйте понять, если сможете, что она будет делать.

#include 
main( ) /*простая программа*/
{
int num;
num = l;
printf ("Я простая");
printf ("вычислительная машина .\n");
printf ("Мое любимое число %d, потому что оно самое первое .\n", num);
}

Если вы считаете, что программа должна вывести нечто на экран дисплея, то вы совершенно правы! Несколько труднее понять, что же появится на экране на самом деле, поэтому давайте выполним программу на ЭВМ и посмотрим к чему это приведет.
Первый шаг заключается в использовании имеющегося у вас текстового редактора для создания файла, содержащего текст программы. Этому файлу необходимо будет присвоить какое-то имя; если вам не приходит в голову ничего оригинального, то назовите его main.с. Выполните компиляцию вашей программы. (Для этого вы должны терпеливо ознакомиться с руководством по компилятору, имеющемуся в составе вашей вычислительной системы.) Теперь запустим программу. Если все пойдет хорошо, то результат должен выглядеть следующим образом:
В общем этот результат не кажется особенно неожиданным. Но какую роль в программе выполняют символы \n и %d? И вообще некоторые строки выглядят немного странно. Здесь необходимы дополнительные пояснения.

Мы выполним два просмотра текста программы: во время первого объясним смысл каждой строки, а во время второго - рассмотрим дополнительные вопросы и детали.


#include -включение другого файла.
Эта строка указывает компилятору, что нужно включить информацию, содержащуюся в файле stdio.h.

main( ) - имя функции

 

Любая программа, написанная на языке Си, состоит из одной или более "функций", являющихся основными модулями, из которых она собирается.
Наша программа состоит из одной функции main, и круглые скобки указывают именно на то, что main( ) - имя функции.

/*простая программа*/ - комментарий.
Вы можете использовать пары символов /* и */ в качестве отбывающей и закрывающей скобок для комментария. Комментарии - это примечания, помогающие понять смысл программы. Они предназначены для читателя и игнорируются компилятором.

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

int num; - оператор описания.
С помощью такого оператора мы объявляем, что будем использовать в программе переменную num, которая принимает целые (int) значения.

num =1; - оператор присваивания.
Этот оператор служит для присваивания переменной num значения 1.

printf (" Я простая"); - оператор вывода на печать.
С его помощью выводится на печать фраза, заключенная в кавычки: Я простая

printf(" вычислительная машина.\n"); - еще один оператор вывода на печать.
Этот оператор добавляет слова вычислительная машина. в конец последней печатаемой фразы. Комбинация символов \n указывает компилятору на начало новой строки.

printf ("Мое любимое число %d, потому что оно самое первое. \n", num);
Этот оператор выводит на печать значение переменной num (равное 1), содержащееся во фразе в кавычках. Символы %d указывают компилятору, где и в какой форме печатать значение этой переменной num.

} - конец. Как уже упоминалось, программа завершается закрывающей фигурной скобкой.
Теперь рассмотрим нашу программу более внимательно.


#include < stdio.h> :
Файл с именем stdio.h является частью пакета, имеющегося в любом компиляторе языка Си и содержащего информацию о вводе-выводе (например, средства взаимодействия программы с вашим терминалом). В качестве имени файла используется аббревиатура английских слов:

standard input/оutput header - стандартный заголовок ввода-вывода.

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

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

main( )
Выбор имени main в качестве названия нашей программы довольно очевиден; более того, назвать ее как-то по-другому и нельзя. Дело в том, что программа, написанная на языке Си, всегда начинает выполняться с функции, называемой main( ), поэтому мы имеем возможность выбирать имена для всех используемых нами Функций кроме той, с которой начинается выполнение программы. Зачем здесь скобки? Как уже упоминалось, они указывают на то, что main( ) - имя функции. Дополнительные вопросы, относящиеся к функциям, будут обсуждаться ниже. Здесь мы только повторим, что функции - это основные модули программы, написанной иа языке Си.

В круглых скобках в общем случае содержится информация, передаваемая этой функции. В нашем простом примере передача информации отсутствует и, следовательно, в скобках ничего не содержится. Заканчивая обсуждение данного вопроса, дадим вам одщ совет: при написании программы старайтесь не пропускать скобок.

Файл, содержащий программу, может иметь любое имя, правда, с тем ограничением, что оно должно удовлетворять системным соглашениям и оканчиваться символом . Например, вместо main.с мы могли бы выбрать имена mighty.с или silly.с.

/*простая программа*/:
Использование комментариев облегчает процесс понимания ва шей программы любым программистом (включая вас самих) Большим удобством при написании комментариев является воз можность располагать их на той же строке, что и операции, кото рые они объясняют. Длинный комментарий может помещаться на отдельной строке или даже занимать несколько строк. Все, что на ходится между символом, указывающим на начало комментария /*, и символом, указывающим на его конец */, игнорируется компилятором, поскольку он не в состоянии интерпретировав язык, отличающийся от Си.

{ и } :
Фигурные скобки { } (и только они) отмечают начало и конец тела функции. Для этой цели не используются ни круглые ( ), ни квадратные [ ] скобки. Фигурные скобки применяются также для того, чтобы объединить несколько операторов программы в сегмент или "блок". Если вы знакомы с такими языками, как Паскаль или Алгол, вы легко сообразите, что такие скобки аналогичны операторам begin и end в этих языках.

int num;:
"Оператор описания переменной" - одно из важнейших средств языка Си. Как уже упоминалось выше, в нашем простом пример вводятся два понятия. Первое - использование в теле функции "переменной", имеющей имя num; второе - с помощью слова int объявляется, что переменная num принимает целые значения. Точка с запятой в конце строки указывает на то, что в ней содержится оператор языка Си, причем этот символ является здесь частью оператора, а не разделителем операторов, как в Паскале.

Слово int служит "ключевым словом", определяющим один из основных типов данных языка Си. Ключевыми словами называют ся специальные зарезервированные слова, используемые для по строения фраз языка; список ключевых слов вы можете найти в приложении в конце книги.

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

Здесь вы можете задать три вопроса. Первый: каким образом надо выбирать имена? Второй: что такое типы данных? Третий: зачем вообще требуется объявлять переменные? Ответы на первый и третий вопросы приведены ниже и отмечены вертикальной линейкой голубого цвета.

Второй вопрос мы обсудим в гл. 3, а здесь сделаем краткое замечание. Язык Си имеет дело с некоторыми классами (или "типами") данных: целыми числами, символами и числами с плавающей точкой. Объявление переменной, имеющей целый или символьный тип позволяет компилятору размещать данные в памяти, осуществлять их выборку и интерпретировать нужным образом.

Выбор имени
Мы предполагаем, что вы используете осмысленные обозначения переменных. Имя переменной может содержать от одного до восьми символов. (Фактически вы можете использовать и большее их число, но компилятор пропустит же символы, начиная с девятого. Поэтому имена shakespeare и shakespencil считались бы одинаковыми, поскольку первые восемь букв у них совпадают.) Для образования имени переменной разрешается использовать строчные и прописные буквы, цифры и символ подчеркивания, считающийся буквой. Первым символом должна быть обязательно буква.

Правильные имена Неправильные имена
wiggly $Z^** cat1
1cat Hot_Tub Hot-Tub _kcaB
don' t

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



Четыре довода в пользу объявления переменных

1. Сведение всех операторов объявления переменных в начало программы облегчает понимание ее смысла. Это особенно справедливо, если вы даете переменным осмысленные имена (например, taxrate [налоговый тариф] вместо r) и, кроме того, включаете в программу комментарии для объяснения того, что обозначают переменные. Документирование программы подобным образом является одним из основных признаков хорошего стиля программирования.

2 . Размышление о том, что поместить в секцию объявления переменных, побуждает спланировать программу перед тем, как погрузиться в ее написание. Это эквивалентно получению ответов на вопросы: какая информация необходима программе при запуске? Какую выходную информацию хотелось бы получить?

3. Объявление переменных позволяет избежать одной из наиболее коварных и труднообнаруживаемых ошибок - неправильно написанных имен. Например, предположим, что программируя на некотором языке, вы использовали оператор
B0ZO = 32.4,
а дальше в программе вы ошибочно написали
ANS = 19.7* BOZO - 2.0
случайно заменив цифру 0 буквой О. Вследствие этого в программе появится новая переменная с именем BOZO, и будет использовано какое-то ее значение (возможно нуль или какой-то "мусор"). В результате переменная ANS получит неправильное значение, и вы, возможно, потратите много времени, пытаясь найти причину. Это не может произойти при программировании на языке Си (если только вы не объявили две переменные со столь похожими именами), поскольку компилятор сразу выдаст сообщение об ошибке, как только встретит в программе необъявленную переменную с именем BOZO.

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

num = 1; :
"Оператор присваивания" является одним из основных средств языка. Приведенную выше строку программы можно интерпретировать

 

так: "присвоить переменной num значение 1". Дело в том, что, согласно оператору в четвертой строке программы, переменной num была выделена ячейка памяти, и только теперь в результате выполнения оператора присваивания переменная получает свое значение. При желании мы могли бы присвоить ей другое значение - вот почему имя num обозначает переменную. Отметим, что этот оператор тоже заканчивается точкой с запятой.

printf (" Я простая");
printf ("вычислительная машина. \n");
printf ("Мое любимое число %d, потому что оно самое первое.\n", num);

Во всех этих строках используется стандартная функция языка Си, называемая printf( ); скобки указывают на то, что мы, конечно же, имеем дело с функцией. Строка символов, заключенная в скобки, является информацией, передаваемой функции printf( ) из нашей главной функции [main( )].

Такая информация называется "аргументом"; в первом случае аргументом является строка "Я простая". Возникает вопрос: что функция printf( ) делает с этим аргументом? Ответ довольно очевиден: она просматривает все символы, содержащиеся между кавычками, и выводит их на экран терминала.

 

Данная строка дает нам пример того, как мы "вызываем" функцию или "обращаемся" к ней, программируя на языке Си. Для этого требуется только указать имя функции и заключить требуемый аргумент (или аргументы) в скобки. Когда при выполнении ваша программа "достигнет" этой строки, управление будет передано указанной функции [в данном случае printf( )]. Когда выполнение функции будет завершено, управление вернется обратно в исходную ("вызывающую") программу.

Что можно сказать по поводу следующей строки программы? В ней имеются символы \n, которые не появились на экране. В чем дело? Эти символы служат директивой начать новую строку на устройстве вывода. Комбинация \n на самом деле представляет собой один символ, называемый "новая строка". Его смысл кратко формулируется так: начать вывод новой строки с самой левой колонки. Другими словами, с помощью этого символа осуществляются те же функции, что и с помощью клавиши [ввод], имеющейся на обычном терминале. Но вы можете сказать, что комбинация \n выглядит, как два символа, а не как один. Вы, конечно же, правы, но просто по смыслу они представляют собой один символ, для которого не существует соответствующей клавиши на клавиатуре. Возникает вопрос: почему для этой цели нельзя использовать клавишу [ввод]? В ответ скажем, что это может быть интерпретировано как некоторая директива вашему текстовому редактору, а не как команда, которая должна быть помещена в память ЭВМ. Другими словами, когда вы нажимаете клавишу [ввод], редактор прекращает заполнение текущей строки, с которой вы в данный момент работаете, и начинает новую строку, оставляя старую неоконченной.

Символ "новая строка" служит одним из примеров того, что называется "управляющей последовательностью". Эта последовательность используется для представления символов, которые трудно или вообще невозможно вводить с обычной клавиатуры. Другими примерами служат \t для табуляции и \b для возврата на одну позицию. В любом случае управляющая последовательность начинается со знака \. Мы вернемся к обсуждению этого вопроса в гл. 3.

Теперь, мы думаем, стало понятно, почему три оператора печати вывели на экран только две строки: аргумент первого оператора не содержал символа "новая строка".

Вид второй строки, появившейся на экране, может вызвать недоуменный вопрос: почему отсутствуют символы %d, имеющиеся в операторе вывода? Напомним, что напечатанная строка имела следующий вид:

Мое любимое число1, потому что оно самое первое.

Вы, наверное, уже догадались - при печати вместо символов %d было подставлено число 1, являющееся значением переменной num. По-видимому, комбинация символов %d служит своего рода указателем места в строке, куда необходимо вставить значение переменной num при печати. На языке Бейсик аналогичный оператор печати выглядел бы следующим образом:

PRINT "Мое любимое число" ; num; "потому что оно самое первое".

На самом деле в языке Си обсуждаемый оператор позволяет сделать несколько больше. Символ % сигнализирует программе, что, начиная с этой позиции, необходимо напечатать число, a d указывает, что переменную необходимо печатать в десятичном формате. Функция printf( ) предоставляет возможность выбора соответствующего формата для печати переменных. Буква f в имени функции printf( ) фактически служит напоминанием, что это оператор печати с заданным форматом.


Теперь, после того как мы привели конкретный пример, вы готовы к тому, чтобы познакомиться с несколькими общими правилами, касающимися программ, написанных на языке Си. Программа состоит из одной или более функций, причем какая-то из них обязательно должна называться main( ). Описание функции состоит из заголовка и тела. Заголовок в свою очередь состоит из директив препроцессора типа #include и т. д. и имени функции.

Отличительным признаком имени функции служат круглые скобки, причем аргумент, вообще говоря, может отсутствовать. Тело функции заключено в фигурные скобки и представляет собой набор операторов, каждый из которых оканчивается символом "точка с запятой". В нашем примере тело состояло из оператора описания, в котором объявлялись имя и тип используемой переменной, оператора присваивания, с помощью которого переменная получила некоторое значение, и, наконец, трех операторов печати, каждый из которых представляет собой вызов функции printf( ).


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

Мы уже упоминали о двух таких способах: выбор осмысленных обозначений для переменных и использование комментариев. Заметим, что эти два метода дополняют друг друга. Если вы дали переменной имя width (ширина), то необходимость в комментарии, сообщающем о том, что данная переменная определяет ширину, отпадает.

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

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

main( ) 
{
int four; four = 4;
printf(" %d \n", four);
}

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


Наша первая программа была довольно простой, и следующий пример будет ненамного сложнее. Он выглядит так:

main( )/* Переводит 2 морские сажени в футы*/ 1) 
{
int feet, fathoms;
fathoms = 2;
feet = 6 *fathoms;
printf (" В %d морских саженях содержится %d футов!" , feet, fathoms);
}




Что здесь нового? Во-первых, мы описали две переменные вместо одной. Для этого потребовалось только разделить в операторе описания имена двух переменных запятой.

Во-вторых, мы выполнили вычисления - использовали громадную вычислительную мощность нашего компьютера для умножения 2 на 6. В Си, так же как и во многих других языках, символ * обозначает умножение. Поэтому смысл оператора

feet = 6 *fathoms;

заключается в следующем: взять величину переменной fathoms, умножить ее на 6 и присвоить результат переменной feet. (Судя по этой парафразе, обычный английский язык менее лаконичен, чем простой язык Си; это одна из причин, лежащих в основе разработки языков программирования.)

И наконец, мы использовали функцию printf( ) более сложным образом. Если вы выполните эту программу на компьютере, то результат должен выглядеть так:

Можно заметить, что было произведено две подстановки: первое вхождение символов %d в строку, заключенную в кавычки, было заменено значением первой переменной (fathoms) из списка, следующего за указанной строкой, а второе - значением второй переменной (feet) из этого же списка. Обратите внимание, что список печатаемых переменных расположен в конце оператора.

Область применения данной программы несколько ограниченна, но она может послужить прообразом программы перевода морских саженей в футы. Все, что нам потребуется - специальный способ присваивания произвольных значений переменной feet; о том, как это делается, вы узнаете несколько позже.


Здесь мы приведем еще один пример. До сих пор в наших программах использовалась только стандартная функция printf( ). В данном разделе мы хотим продемонстрировать, как включить в программу2) и использовать функцию, которую вы сами написали.


main( )/* butler*/
{
printf("Я вызываю функцию butler.\n");
butler( );
printf ("Да. Принесите мне чашку чая и гибкие диски.\n");
}
butler( )
{
printf("Bы вызывали, сэр?\n");
}

Результаты работы программы выглядят следующим образом:

Я вызываю функцию butler. Bы вызывали, сэр? Да. Принесите мне чашку чая и гибкие диски.

Функция butler( ) определяется точно так же, как и функция main(); ее тело заключено в фигурные скобки. Вызов функции осуществляется путем простого указания ее имени, включая круглые скобки. Мы вернемся к этому важному вопросу только в гл. 9, а здесь хотели продемонстрировать ту легкость, с которой вы можете включать в программу свои собственные функции.


Ниже приведена краткая сводка строгих правил (но не чрезмерно жестких), которые, мы надеемся, вы усвоили. Мы включили сюда же краткие примеры.

Как назвать файл, содержащий вашу программу: eye.с, или black.с, или infan.c и т. п.
Какое имя можно использовать в качестве названия программы, состоящей из одной функции: main().
Структура простой программы: заголовок, тело, фигурные скобки, операторы. Как описать целую переменную: int varname;
Как присвоить значение переменной: varname = 1024;
Как напечатать фразу printf ("Хотите купить утку?");
Как напечатать значение переменной: printf ("%d", varname);
Символ новая строка: \n
Как включать комментарии в программу: /*анализ движения наличных денег*/


ВОПРОСЫ И ОТВЕТЫ

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


Вопросы

1. Икабод Боуди Марфут (ИБМ)3) подготовил программу, приведенную ниже, и принес ее вам для проверки. Пожалуйста, помогите ему найти в ней ошибки.

include studio, h main{} /*эта программа печатает число недель в году/*
(
int s

s: = 56;
print (В году s недель.);



2. Что будет напечатано в каждом из примеров, приведенных ниже, в предположении, что они являются частями некоторых полных программ?
a. printf(" Б-э-э Б-э-э, Черная Овца.");
а. printf("У тебя есть шерсть?\n");
б. рrintf("Убирайся!\n Мешок сала!");
в. printf("Что?\n Нет/n Кларнет?\n");
г. int num;
num = 2;
printf(" %d + %d = %d", num, num, num + num);


Ответы

1.
Строка 1:
данная строка должна начинаться с символа # правильное написание имени файла - stdio.h; имя файла должно быть заключено в угловые скобки.

Строка 2:
вместо фигурных скобок {} необходимо использовать круглые ( );
комментарий должен оканчиваться символами */, а не /*

Строка 3:
вместо круглой скобки ( должна стоять фигурная {.

Строка 4:
оператор должен оканчиваться символом "точка с запятой".

Строка 5:
эту строку (пустую) м-р ИБМ написал Совершенно правильно!

Строка 6:
в операторе присваивания необходимо использовать символ =, а не :=. (К сожалению, м-р ИБМ имеет представление о языке Паскаль.)
В году 52 недели, а не 56.

Строка 7:
оператор должен выглядеть так printf ("В году %d недель. \n", s);

Строка 8:
отсутствует, но она обязательно должна быть и содержать закрывающую фигурную скобку - }.

2.     а. Б-э-э Б-э-э. Черная Овца.У тебя есть шерсть?
(Заметим, что пробел после точки отсутствует. Для того чтобы поместить в это место пробел, необходимо было вместо "У тебя" писать " У тебя")
б. Убирайся!
Мешок сала!
(Отметим, что курсор теперь находится в конце второй строчки.)
в. Что?
Нет /n Кларнет?
Заметим, что символ (/) производит не тот же эффект, как символ (\)
г. 2 + 2 = 4
(Отметим, что каждое вхождение комбинации символов %d в строку заменяется значением соответствующей переменной из списка. Заметим также, что символ + означает сложение и что таким образом вычисления могут быть проведены "внутри" оператора printf( ).)


УПРАЖНЕНИЯ

Чтобы изучить язык Си, одного только чтения недостаточно. Вы должны попробовать сами написать одну или две простые программы и посмотреть, пройдет ли все так же гладко, как это может показаться в результате чтения данной главы. Мы хотим предложить вам несколько идей, но, если желаете, вы можете воспользоваться своими собственными соображениями на этот счет.
1. Напишите программу, печатающую ваше имя.
2. Напишите программу, печатающую ваши имя и адрес, используя три или более строк.
3. Напишите программу, которая укажет ваш возраст, данный в годах, в днях. Не усложняйте ее, учитывая високосные и невисокосные годы.