You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: lang_c/1/2__structura_programm_na_c/article.md
+15-13Lines changed: 15 additions & 13 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -34,6 +34,7 @@ int main(void)
34
34
Листинг 2.
35
35
```c
36
36
// комментарий
37
+
37
38
int main(void)
38
39
{
39
40
int a, b, c;
@@ -106,11 +107,12 @@ int main(void)
106
107
107
108
Если `;` пропустить/забыть, то компилятор не сможет отделить одну инструкцию от другой, не сможет скомплировать программу и выдаст ошибку.
108
109
110
+
109
111
Но вернёмся к фигурным скобкам в определении функции `main`. В нашем случае мы объединяем две инструкции, давая понять компилятору, что они обе относятся к функции `main`.
110
112
111
113
Про первую инструкцию мы скажем чуть ниже, а пока посмотрим на вторую инструкцию.
112
114
113
-
Перед закрывающей фигурной скобкой мы видим инструцию`return`. Эта инструкция (иногда ещё говорят команда или оператор) отвечает за то, чтобы вернуть значение из функции. Т.е. смотрите, если выполнение программы дошло до этого места, то значит, всё было хорошо и никаких ошибок не возникло, а значит, можно вернуть значение нуль.
115
+
Перед закрывающей фигурной скобкой мы видим инструкцию`return`. Эта инструкция отвечает за то, чтобы вернуть значение из функции. Т.е. смотрите, если выполнение программы дошло до этого места, то значит, всё было хорошо и никаких ошибок не возникло, а значит, можно вернуть значение нуль.
114
116
115
117
Вы можете спросить, а почему именно нуль? А чёрт его знает! Просто так договорились. Можно, в принципе, возвращать какое-нибудь другое целое число, например `100`, или `-236`. Лишь бы оно было целым числом. Вы же ещё помните про `int`? Поэтому и целое.
116
118
@@ -139,20 +141,18 @@ int main(void) // заголовок функции main
139
141
#include <stdio.h>
140
142
```
141
143
142
-
Данная строчка -- это указание компилятору, которое буквально означает «подключи файл stdio.h». Такие указания, начинающиеся с символа `#`, называются =директивами=. Во время компиляции вместо этой строчки будет подставлено содержимое файла `stdio.h`. Пара слов об этом файле. `stdio.h` (от англ. STanDard Input Output) -- это один из стандартных =заголовочных файлов=. В нём объявлено различные стандартные функции, связанные с вводом и выводом данных.
144
+
Данная строчка -- это указание компилятору, которое буквально означает «подключи файл stdio.h». Такие указания, начинающиеся с символа `#`, называются =директивами=. Во время компиляции вместо этой строчки будет подставлено содержимое файла `stdio.h`. Пара слов об этом файле. `stdio.h` (от англ. STanDard Input Output) -- это один из стандартных =заголовочных файлов=. В этом файле объявлены различные стандартные функции, связанные с вводом и выводом данных.
143
145
144
146
Возникают резонные вопросы: "И зачем писать эту строчку?", "Зачем нам вообще понадобилось вставлять сюда этот файл?". Это нужно для того, чтобы в своей программе мы могли использовать стандартную функцию вывода на экран `printf`.
145
147
146
148
147
-
Дело вот в чем. Прежде чем использовать что-нибудь в своей программе, нам надо сначала это определить. Представьте ситуацию: вас попросили принести канделябр, а вы знать не знаете, что это такое. Непонятно, что делать.
149
+
Дело вот в чём. Прежде чем использовать что-нибудь в своей программе, нам надо сначала это определить. Представьте ситуацию: вас попросили принести канделябр, а вы знать не знаете, что это такое. Непонятно, что делать.
148
150
149
151
150
152
Так же и компилятор. Когда он встречает какую-нибудь функцию, он ищет её определение (заголовок и тело функции) в начале программы (с самого начала и до момента её использования в программе). Так вот, функция `printf` объявлена в файле `stdio.h`. Поэтому мы и подключаем его. И вот когда мы его подключим с помощью директивы `#include`, компилятор сможет найти функцию `printf`, иначе он выдаст ошибку.
151
153
152
154
% **Важно!**
153
-
Обратите внимание, директивы не являются инструкциями, а поэтому у них в конце не пишут `;`.
154
-
155
-
Тут дело вот в чём. Как мы уже знаем, компиляция -- это процесс перевода исходного кода программы на понятный компьютеру язык. Этот процесс состоит из нескольких последовательных этапов. На одном из первых этапов работает =препроцессор=, который и занимается обработкой директив типа `#include`. Так что формально правильно говорить =директивы препроцессора=. У препроцессора свой способ определять, где заканчивается одна директива и начинается другая, символ `;` для этого не используется.
155
+
Обратите внимание, директивы не являются инструкциями, а поэтому у них в конце не ставят `;`.
156
156
157
157
158
158
Кстати, дополним нашу карту знаний. Перед функцией `main` добавим ещё один блок -- блок подключения заголовочных файлов.
@@ -170,15 +170,15 @@ printf("Hello, World!\n");
170
170
171
171
Функция `printf`, как мы уже знаем, предназначена для вывода данных. В данном простейшем случае мы вызываем её с одним аргументом -- строкой, заключённой в двойные кавычки `"Hello, world!\n"`. Её работа будет заключаться в том, что она просто выведет переданную ей строку на экран терминала (консоли) без изменений.
172
172
173
-
Постойте, а что это за `\n`? На экране во время запуска программы никакого `\n` не было. Зачем, спрашивает, тогда мы тут это написали?
173
+
Постойте, а что это за `\n`? На экране во время запуска программы никакого `\n` не было. Зачем, спрашивается, тогда мы тут это написали?
174
174
175
-
На самом деле этот символ там тоже был, просто вы его не заметили. Запись `\n` -- это специальный способ для записи символа переноса строки. Это как в Wordе нажать клавишу `Enter`. Есть и другие последовательности, начинающиеся с символа `\`, мы познакомимся с ними чуть позже. Пока лишь скажу, что их называют =escape-последовательностями (escape sequences)= или =управляющими последовательностями=, т.к. они управляют выводом.
175
+
На самом деле этот символ там тоже был, просто вы его не заметили. Последовательность `\n` -- используют для записи символа переноса строки. Это как в Wordе нажать клавишу `Enter`.
176
176
177
177
Обобщим информацию про вызов функций. Чтобы вызвать какую-нибудь функцию, необходимо написать её имя и указать передаваемые ей аргументы в круглых скобках. Ну и написать `;`, конечно.
178
178
179
179
Количество передаваемых аргументов зависит от количества параметров, указанных в определении функции. Например, выше мы вызвали функцию `printf` и передали ей один аргумент -- строку, которую необходимо вывести на экран. Если функции не нужны аргументы, то в круглых скобках ничего писать не нужно, но сами круглые скобки всё же надо написать.
180
180
181
-
Самый внимательный читатель уже, возможно, задаётся вопросом, почему иногда мы называет то, что записано в скобках =параметры функции=, а иногда -- =аргументы функции=. Тут всё просто. Когда мы в программе определяем функцию, т.е. пишем её заголовок и тело, то мы говорим "параметры" (то, что функция ожидает получить). Когда же мы вызываем функцию и при этом передаём ей какие-то конкретные данные, то мы говорим "аргументы" (то, что функция действительно получает).
181
+
Самый внимательный читатель уже, возможно, задаётся вопросом, почему иногда мы называем то, что записано в скобках =параметры функции=, а иногда -- =аргументы функции=. Тут всё просто. Когда мы в программе определяем функцию, т.е. пишем её заголовок и тело, то мы говорим "параметры" (то, что функция ожидает получить). Когда же мы вызываем функцию и при этом передаём ей какие-то конкретные данные, то мы говорим "аргументы" (то, что функция действительно получает).
182
182
183
183
Давайте приведу наглядную аналогию. Представьте себе заголовок функции, как бланк бумажной анкеты (у всех, кто сдаёт ЕГЭ прошу прощения за возможные флешбеки).
184
184
@@ -200,9 +200,10 @@ int main(void)
200
200
}
201
201
```
202
202
203
-
% Пустые строки, пробелы и переносы строк в коде программы на Си **чаще всего** ни на что не влияют и ничего не обозначают. Но мы их всё равно добавляем, чтобы сделать код более читаемым и понятным.
203
+
% **Важно!**
204
+
Пустые строки, пробелы и переносы строк в коде программы на Си **чаще всего** ни на что не влияют и ничего не обозначают. Их добавляют, чтобы сделать код более читаемым и понятным.
204
205
205
-
Например, программа могла бы выглядеть вот так:
206
+
Например, программа «Hello, World!» могла бы выглядеть вот так:
206
207
207
208
Листинг 9. Программа «Hello, World!» в стиле В.В. Маяковского
208
209
```c
@@ -246,16 +247,17 @@ int main(void){printf("Hello, World!\n");return 0;}
246
247
0;}
247
248
```
248
249
250
+
249
251
Думаю, эти примеры наглядно показывают, что использование пробелов, переносов и пустых строк очень сильно повышают читаемость и понятность вашего кода. =)
250
252
251
253
252
254
Ну вот вроде бы и всё. На этом первый урок можно считать законченным. Подведём итог.
253
255
254
256
255
-
Самое главное в этом уроке это, конечно, общая структура программы. Но кроме того, мы научились выводить на экран произвольный текст. Кажется, что совсем ничего вроде и не узнали, но даже этого хватит для того, чтобы, например, сделать небольшой подарок своей маме на 8 марта.
257
+
Самое главное в этом уроке это, конечно, общая структура программы на языке Си. Но кроме того, мы научились выводить на экран произвольный текст. Кажется, что совсем ничего вроде и не узнали, но даже этих знаний хватит для того, чтобы сделать небольшой подарок своей маме на 8 марта.
256
258
257
259

258
260
259
261
260
262
% **UPD от 27.05.2025**
261
-
Это новая версия первого урока. В неё добавлены всякие детали и подробности про функции, препроцессор и пр. Пожалуйста, если какое-то место было трудно понять, пожалуйста, напишите об этом комментариях ниже.
263
+
Это новая версия первого урока. Добавлены всякие подробности про функциии. Пожалуйста, если какое-то место было трудно понять, напишите об этом комментариях ниже.
Copy file name to clipboardExpand all lines: lang_c/1/2__structura_programm_na_c/practice.md
+9-4Lines changed: 9 additions & 4 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -8,12 +8,15 @@
8
8
9
9
- Попробуйте добавить управляющий символ `\n` после слова Hello. Посмотрите, как изменится ситуация на экране.
10
10
11
-
- Попробуйте добавить в программу еще несколько функций вывода на экран.
11
+
- Попробуйте добавить в программу ещё один-два вызова функции `printf`.
12
12
13
-
- Попробуйте удалить из программы точку с запятой после какой-нибудь инструкции. Посмотрите, как на это отреагирует ваш компилятор, какую ошибку он вам выдаст.
13
+
- Попробуйте удалить из программы точку с запятой у какой-нибудь инструкции. Посмотрите, как на это отреагирует ваш компилятор, какую ошибку он вам выдаст.
14
14
15
-
- Попробуйте убрать из программы директиву `#include <stdio.h>`. Что на это вам скажет компилятор?
15
+
- Попробуйте убрать из программы директиву `#include <stdio.h>`. Как на это отреагирует ваш компилятор?
16
16
17
+
- Попробуйте заменить `0` в инструкции `return 0;` на какое-нибудь другое целое число. Как изменится поведение программы?
18
+
19
+
- Проверьте, что программы из Листингов 9-11 рабоают.
17
20
18
21
### Исследовательские задачи для хакеров:
19
22
@@ -26,4 +29,6 @@
26
29
пишите
27
30
ваш код
28
31
```
29
-
````
32
+
````
33
+
34
+
- Попробуйте заменить `return 0;` на `return;`. Вообще говоря, так делать нельзя и должна появляться ошибка при компиляции. Но, говорят, что некоторые компиляторы на такой код не ругаются. Если ваш компилятор как раз из таких, напишите об этом в комментариях (с указанием используемого компилятора и/или IDE).
0 commit comments