Программы
Почему мы начали не с "Hello World"?

Почему мы начали не с "Hello World"?

Часто начинают именно с "Hello world", но для нас это не подходит

В начале было слово. И слово было... «Hello, World!»

Нет, ну правда, сколько было куроводств с первым примером кода – вывести "Hello world!" на консоль!

    #include <stdio.h>

    int main(void) {
        printf("Hello world");
        return 0;
    }

– вот как-то так.

И, к слову, это "проклятье" тянется как раз с книги K&R "The C Programming Language". Загуглите – приятная книжка, прямо от авторов языка!

Тогда почему же мы начали со сложнейшей утилиты для Unix-like ОС, вместо простого "Hello world"?..

А чё такое "#include"? Рад, что ты спросил! Ведь за этим кроется просто бездна информации, отдельный язык программирования и целый препроцессор!

Про то, на сколько замечательный printf, я, скорее всего не расскажу в рамках этой книжки.

Изображение Изучаем язык программирования Си

Препроцессор Си

Невероятно, но факт – Ритчи и Керниган придумали язык над языком. Ещё до того, как компилятор начинает собирать код Си, запускается препроцессор, в задачах которого:

  • замена соответствующих диграфов и триграфов на эквивалентные символы «#» и «\»;
  • удаление экранированных символов перевода строки;
  • замена строчных и блочных комментариев пустыми строками (с удалением окружающих пробелов и символов табуляции);
  • вставка (включение) содержимого произвольного файла (#include);
  • макроподстановки (#define);
  • условная компиляция (#if, #ifdef, #elif, #else, #endif);
  • вывод сообщений (#warning, #error).

И скептик бы сказал, что это очередной костыль, чтобы это всё заработало, когда стало большим... Так и есть! Однако именно благодаря препроцессору мы можем подключить заголовочный файл работы с вводом-выводом (stdio.h) и использовать printf.

К счастью, тогда костыли были зеленее, а небо голубее...

    #include <stdio.h>

Как раз этой командой препроцессору мы говорим подключить заголовочный файл stdio.h для того, чтобы мы могли использовать функции (определённые в нём). Например, оттуда мы можем получить printf – уже знакомый вам по курсу ОС (примечание для моих студентов, либо же вы можете найти этот курс на 900913.ru). Также там есть функция puts – положить строку на стандартный вывод.

Препроцессор Си – одно из средств упростить разработку на Си. Мы часто будем прибегать к нему. И рассмотрим подробнее позднее. А также напишем свои макросы и header файлы.

И всё же "Hello world"

Традиционный (со времён K&R) стартовый пример кода:

    #include <stdio.h>

    int main(void) {
        puts("Hello world");
        return 0;
    }

Что происходит:

  • В теле функции (внутри фигурных скобок):
    • Кладём строку на стандартный вывод (puts). Параметром идёт строка, которую хотим вывести.
    • Возвращаем из функции 0. Для функции main – это код возврата команды (errorlevel / $?).

Собираем, запускаем:

→ clang hello-world.c -o hello_world
→ ./hello_world
Hello world

Вот и мы научились великому навыку писать "привет мир"!