Skip to content

Commit fb2ff7e

Browse files
committed
исправления в 1.3
1 parent 34efbc5 commit fb2ff7e

File tree

4 files changed

+30
-18
lines changed

4 files changed

+30
-18
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,4 @@
11
/sandbox/666/
2+
3+
*.tmp
4+
*.log

lang_c/1/2__structura_programm_na_c/article.md

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ int main(void)
3434
Листинг 2.
3535
```c
3636
// комментарий
37+
3738
int main(void)
3839
{
3940
int a, b, c;
@@ -106,11 +107,12 @@ int main(void)
106107

107108
Если `;` пропустить/забыть, то компилятор не сможет отделить одну инструкцию от другой, не сможет скомплировать программу и выдаст ошибку.
108109

110+
109111
Но вернёмся к фигурным скобкам в определении функции `main`. В нашем случае мы объединяем две инструкции, давая понять компилятору, что они обе относятся к функции `main`.
110112

111113
Про первую инструкцию мы скажем чуть ниже, а пока посмотрим на вторую инструкцию.
112114

113-
Перед закрывающей фигурной скобкой мы видим инструцию `return`. Эта инструкция (иногда ещё говорят команда или оператор) отвечает за то, чтобы вернуть значение из функции. Т.е. смотрите, если выполнение программы дошло до этого места, то значит, всё было хорошо и никаких ошибок не возникло, а значит, можно вернуть значение нуль.
115+
Перед закрывающей фигурной скобкой мы видим инструкцию `return`. Эта инструкция отвечает за то, чтобы вернуть значение из функции. Т.е. смотрите, если выполнение программы дошло до этого места, то значит, всё было хорошо и никаких ошибок не возникло, а значит, можно вернуть значение нуль.
114116

115117
Вы можете спросить, а почему именно нуль? А чёрт его знает! Просто так договорились. Можно, в принципе, возвращать какое-нибудь другое целое число, например `100`, или `-236`. Лишь бы оно было целым числом. Вы же ещё помните про `int`? Поэтому и целое.
116118

@@ -139,20 +141,18 @@ int main(void) // заголовок функции main
139141
#include <stdio.h>
140142
```
141143

142-
Данная строчка -- это указание компилятору, которое буквально означает «подключи файл stdio.h». Такие указания, начинающиеся с символа `#`, называются =директивами=. Во время компиляции вместо этой строчки будет подставлено содержимое файла `stdio.h`. Пара слов об этом файле. `stdio.h` (от англ. STanDard Input Output) -- это один из стандартных =заголовочных файлов=. В нём объявлено различные стандартные функции, связанные с вводом и выводом данных.
144+
Данная строчка -- это указание компилятору, которое буквально означает «подключи файл stdio.h». Такие указания, начинающиеся с символа `#`, называются =директивами=. Во время компиляции вместо этой строчки будет подставлено содержимое файла `stdio.h`. Пара слов об этом файле. `stdio.h` (от англ. STanDard Input Output) -- это один из стандартных =заголовочных файлов=. В этом файле объявлены различные стандартные функции, связанные с вводом и выводом данных.
143145

144146
Возникают резонные вопросы: "И зачем писать эту строчку?", "Зачем нам вообще понадобилось вставлять сюда этот файл?". Это нужно для того, чтобы в своей программе мы могли использовать стандартную функцию вывода на экран `printf`.
145147

146148

147-
Дело вот в чем. Прежде чем использовать что-нибудь в своей программе, нам надо сначала это определить. Представьте ситуацию: вас попросили принести канделябр, а вы знать не знаете, что это такое. Непонятно, что делать.
149+
Дело вот в чём. Прежде чем использовать что-нибудь в своей программе, нам надо сначала это определить. Представьте ситуацию: вас попросили принести канделябр, а вы знать не знаете, что это такое. Непонятно, что делать.
148150

149151

150152
Так же и компилятор. Когда он встречает какую-нибудь функцию, он ищет её определение (заголовок и тело функции) в начале программы (с самого начала и до момента её использования в программе). Так вот, функция `printf` объявлена в файле `stdio.h`. Поэтому мы и подключаем его. И вот когда мы его подключим с помощью директивы `#include`, компилятор сможет найти функцию `printf`, иначе он выдаст ошибку.
151153

152154
% **Важно!**
153-
Обратите внимание, директивы не являются инструкциями, а поэтому у них в конце не пишут `;`.
154-
155-
Тут дело вот в чём. Как мы уже знаем, компиляция -- это процесс перевода исходного кода программы на понятный компьютеру язык. Этот процесс состоит из нескольких последовательных этапов. На одном из первых этапов работает =препроцессор=, который и занимается обработкой директив типа `#include`. Так что формально правильно говорить =директивы препроцессора=. У препроцессора свой способ определять, где заканчивается одна директива и начинается другая, символ `;` для этого не используется.
155+
Обратите внимание, директивы не являются инструкциями, а поэтому у них в конце не ставят `;`.
156156

157157

158158
Кстати, дополним нашу карту знаний. Перед функцией `main` добавим ещё один блок -- блок подключения заголовочных файлов.
@@ -170,15 +170,15 @@ printf("Hello, World!\n");
170170
171171
Функция `printf`, как мы уже знаем, предназначена для вывода данных. В данном простейшем случае мы вызываем её с одним аргументом -- строкой, заключённой в двойные кавычки `"Hello, world!\n"`. Её работа будет заключаться в том, что она просто выведет переданную ей строку на экран терминала (консоли) без изменений.
172172
173-
Постойте, а что это за `\n`? На экране во время запуска программы никакого `\n` не было. Зачем, спрашивает, тогда мы тут это написали?
173+
Постойте, а что это за `\n`? На экране во время запуска программы никакого `\n` не было. Зачем, спрашивается, тогда мы тут это написали?
174174
175-
На самом деле этот символ там тоже был, просто вы его не заметили. Запись `\n` -- это специальный способ для записи символа переноса строки. Это как в Wordе нажать клавишу `Enter`. Есть и другие последовательности, начинающиеся с символа `\`, мы познакомимся с ними чуть позже. Пока лишь скажу, что их называют =escape-последовательностями (escape sequences)= или =управляющими последовательностями=, т.к. они управляют выводом.
175+
На самом деле этот символ там тоже был, просто вы его не заметили. Последовательность `\n` -- используют для записи символа переноса строки. Это как в Wordе нажать клавишу `Enter`.
176176
177177
Обобщим информацию про вызов функций. Чтобы вызвать какую-нибудь функцию, необходимо написать её имя и указать передаваемые ей аргументы в круглых скобках. Ну и написать `;`, конечно.
178178
179179
Количество передаваемых аргументов зависит от количества параметров, указанных в определении функции. Например, выше мы вызвали функцию `printf` и передали ей один аргумент -- строку, которую необходимо вывести на экран. Если функции не нужны аргументы, то в круглых скобках ничего писать не нужно, но сами круглые скобки всё же надо написать.
180180
181-
Самый внимательный читатель уже, возможно, задаётся вопросом, почему иногда мы называет то, что записано в скобках =параметры функции=, а иногда -- =аргументы функции=. Тут всё просто. Когда мы в программе определяем функцию, т.е. пишем её заголовок и тело, то мы говорим "параметры" (то, что функция ожидает получить). Когда же мы вызываем функцию и при этом передаём ей какие-то конкретные данные, то мы говорим "аргументы" (то, что функция действительно получает).
181+
Самый внимательный читатель уже, возможно, задаётся вопросом, почему иногда мы называем то, что записано в скобках =параметры функции=, а иногда -- =аргументы функции=. Тут всё просто. Когда мы в программе определяем функцию, т.е. пишем её заголовок и тело, то мы говорим "параметры" (то, что функция ожидает получить). Когда же мы вызываем функцию и при этом передаём ей какие-то конкретные данные, то мы говорим "аргументы" (то, что функция действительно получает).
182182
183183
Давайте приведу наглядную аналогию. Представьте себе заголовок функции, как бланк бумажной анкеты (у всех, кто сдаёт ЕГЭ прошу прощения за возможные флешбеки).
184184
@@ -200,9 +200,10 @@ int main(void)
200200
}
201201
```
202202

203-
% Пустые строки, пробелы и переносы строк в коде программы на Си **чаще всего** ни на что не влияют и ничего не обозначают. Но мы их всё равно добавляем, чтобы сделать код более читаемым и понятным.
203+
% **Важно!**
204+
Пустые строки, пробелы и переносы строк в коде программы на Си **чаще всего** ни на что не влияют и ничего не обозначают. Их добавляют, чтобы сделать код более читаемым и понятным.
204205

205-
Например, программа могла бы выглядеть вот так:
206+
Например, программа «Hello, World!» могла бы выглядеть вот так:
206207

207208
Листинг 9. Программа «Hello, World!» в стиле В.В. Маяковского
208209
```c
@@ -246,16 +247,17 @@ int main(void){printf("Hello, World!\n");return 0;}
246247
0;}
247248
```
248249
250+
249251
Думаю, эти примеры наглядно показывают, что использование пробелов, переносов и пустых строк очень сильно повышают читаемость и понятность вашего кода. =)
250252
251253
252254
Ну вот вроде бы и всё. На этом первый урок можно считать законченным. Подведём итог.
253255
254256
255-
Самое главное в этом уроке это, конечно, общая структура программы. Но кроме того, мы научились выводить на экран произвольный текст. Кажется, что совсем ничего вроде и не узнали, но даже этого хватит для того, чтобы, например, сделать небольшой подарок своей маме на 8 марта.
257+
Самое главное в этом уроке это, конечно, общая структура программы на языке Си. Но кроме того, мы научились выводить на экран произвольный текст. Кажется, что совсем ничего вроде и не узнали, но даже этих знаний хватит для того, чтобы сделать небольшой подарок своей маме на 8 марта.
256258
257259
![Программа-открытка на 8 марта](./otkritka.gif)
258260
259261
260262
% **UPD от 27.05.2025**
261-
Это новая версия первого урока. В неё добавлены всякие детали и подробности про функции, препроцессор и пр. Пожалуйста, если какое-то место было трудно понять, пожалуйста, напишите об этом комментариях ниже.
263+
Это новая версия первого урока. Добавлены всякие подробности про функциии. Пожалуйста, если какое-то место было трудно понять, напишите об этом комментариях ниже.

lang_c/1/2__structura_programm_na_c/practice.md

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,15 @@
88

99
- Попробуйте добавить управляющий символ `\n` после слова Hello. Посмотрите, как изменится ситуация на экране.
1010

11-
- Попробуйте добавить в программу еще несколько функций вывода на экран.
11+
- Попробуйте добавить в программу ещё один-два вызова функции `printf`.
1212

13-
- Попробуйте удалить из программы точку с запятой после какой-нибудь инструкции. Посмотрите, как на это отреагирует ваш компилятор, какую ошибку он вам выдаст.
13+
- Попробуйте удалить из программы точку с запятой у какой-нибудь инструкции. Посмотрите, как на это отреагирует ваш компилятор, какую ошибку он вам выдаст.
1414

15-
- Попробуйте убрать из программы директиву `#include <stdio.h>`. Что на это вам скажет компилятор?
15+
- Попробуйте убрать из программы директиву `#include <stdio.h>`. Как на это отреагирует ваш компилятор?
1616

17+
- Попробуйте заменить `0` в инструкции `return 0;` на какое-нибудь другое целое число. Как изменится поведение программы?
18+
19+
- Проверьте, что программы из Листингов 9-11 рабоают.
1720

1821
### Исследовательские задачи для хакеров:
1922

@@ -26,4 +29,6 @@
2629
пишите
2730
ваш код
2831
```
29-
````
32+
````
33+
34+
- Попробуйте заменить `return 0;` на `return;`. Вообще говоря, так делать нельзя и должна появляться ошибка при компиляции. Но, говорят, что некоторые компиляторы на такой код не ругаются. Если ваш компилятор как раз из таких, напишите об этом в комментариях (с указанием используемого компилятора и/или IDE).

0 commit comments

Comments
 (0)