Перейти к содержанию

Язык Си в примерах/Простейшая программа «Hello World»

Материал из Викиучебника — открытых книг для открытого мира

Язык Си в примерах


  1. Компиляция программ
  2. Простейшая программа «Hello World»
  3. Учимся складывать
  4. Максимум
  5. Таблица умножения
  6. ASCII-коды символов
  7. Верхний регистр
  8. Скобочки
  9. Факториал
  10. Степень числа
  11. Треугольник Паскаля
  12. Корень уравнения
  13. Система счисления
  14. Сортировка
  15. Библиотека complex
  16. Сортировка на основе qsort
  17. RPN-калькулятор
  18. RPN-калькулятор на Bison
  19. Простая грамматика
  20. Задача «Расчёт сопротивления схемы»
  21. Простая реализация конечного автомата
  22. Использование аргументов командной строки
  23. Чтение и печать без использования stdio
  24. Декодирование звукозаписи в формате ADX
  25. Другие примеры
  26. XCC C

Вариант «простой»

[править]

Первая программа, которую мы рассмотрим, — это «Hello World» — программа, которая выведет на экран строку текста «Hello, World!» («Здравствуй, мир!») и закончит своё выполнение.

#include <stdio.h>

int main (void)
{
  puts ("Hello, World!");
  return 0;
}

Посмотрим на неё внимательно. Первая строка — #include <stdio.h> — означает «включи заголовок stdio.h». В этом заголовке объявляются функции, связанные с вводом и выводом данных.[1][2]

Аббревиатуру stdio можно перевести как стандартный ввод-вывод (англ. standard input/output). Буква «h» после точки означает заголовок (англ. header). В заголовках (которые как правило представлены отдельными заголовочными файлами) обычно объявляются предоставляемые соответствующими им библиотеками функции, типы данных, константы и определения препроцессора.[3]

Далее идёт определение функции main. Оно начинается с объявления:

int main (void)

что значит: «функция с именем main, которая возвращает целое число (число типа int от англ. integer) и у которой нет аргументов (void)»

В качестве варианта, стандарт допускает определение функции main как функции двух аргументов (int argc и char *argv[] — имена, разумеется, могут быть произвольными), что используется для получения доступа к аргументам командной строки из программы. В данном случае, эта возможность не требуется, поэтому функция определена как безаргументная (что также явно разрешено стандартом.)[4]

Английское слово void можно перевести как «пустота». Далее открываются фигурные скобки и идёт тело функции, в конце фигурные скобки закрываются. Функция main — главная функция программы, именно с нее начинается выполнение программы.

Тело функции, в свою очередь, определяет последовательность действий, выполняемых данной функцией — логику функции. Наша функция выполняет одно единственное действие:

  puts ("Hello, World!");

Это действие, в свою очередь, есть вызов функции puts стандартной библиотеки.[5] В результате выполнения этого вызова, на стандартный вывод (которым, скорее всего, окажется экран или окно на экране) печатается строка Hello, world!.

Затем идёт команда return 0;, которая завершает выполнение функции с возвратом значения 0, определяемого стандартом (для функции main) как код успешного завершения.[6][7]

Вариант «классический»

[править]

Этот вариант отличается использованием функций printf (вместо puts) и getchar.

#include <stdio.h>

int main (void)
{
  printf ("Hello, World!\n");
  getchar ();
  return 0;
}

В отличие от функции puts, выводящей переданную в качестве аргумента символьную строку, первый и обязательный аргумент функции printf определяет формат вывода.[8]

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

Обратите внимание на появившуюся в строковой константе комбинацию \n — она включает в выводимую строку управляющий код (или управляющий символ) перевода (также разрыва или завершения) строки. В отличие от функции puts, всегда добавляющей этот код к выводимой строке, printf требует явного его указания.

Действующая редакция стандарта определяет семь таких комбинаций, причем все они записываются с помощью символа обратной косой черты \ (см. ASCII коды символов).[9]

Обратим внимание и на следующее новшество:

  getchar ();

Окружение, в котором запускается программа, как правило можно настроить так, что вывод программы будет оставаться на экране после ее выполнения неограниченно долго. Проще всего это обеспечить вызывая программу из командного интерпретатора (который, в свою очередь, может быть запущен в окне эмулятора терминала) или (в зависимости от системы) окна Cmd.exe.

Однако, при запуске непосредственно из графического окружения, отведенное программе окно может закрыться сразу же после завершения программы. Функция getchar[10] ожидает ввод пользователя, тем самым «откладывая» завершение программы (return). Какие именно действия могут прервать это ожидание — зависит от системы, однако можно надеяться, что нажатие клавиши ⏎ Enter завершит эту функцию в любой системе.

В некоторых руководствах для этой же цели предлагается функция getch. Однако, эта функция (в отличие от getchar) не является стандартной и, к тому же, зависима от платформы. Так, в некоторых системах использование getch требует включения файла curses.h и предшествующего вызова функции initscr. В других системах, однако, getch может быть объявлена в conio.h, и выполнение initscr — не требуется.

Вариант «экзотический»

[править]

Наконец, рассмотрим следующий, выходящий за рамки стандарта, вариант этой программы.

#include <windows.h>

int
main (void)
{
  MessageBox (0, "Hello, World!",
              "Message", MB_OK);
  return 0;
}

Использование заголовка windows.h может произвести впечатление приемлемости этого варианта кода в рамках только лишь одной конкретной системы. Однако, для использованного здесь интерфейса существует и независимая свободная реализация — Wine, — позволяющая собрать и выполнить данный вариант на таких системах, как, например, GNU/Linux, FreeBSD, Solaris и Mac OS X.

См. также

[править]

Примечания

[править]
  1. В действительности, #include <...> — это директива препроцессора, то есть команда, которая выполняется до начала компиляции файла. Смысл этой директивы очень прост и заключается в том, чтобы на место, где указана эта директива, вставить содержимое файла, имя которого указано в угловых скобках. Обычно заголовочные файлы содержат только прототипы функций, то есть просто список функций с указанием аргументов и типа возвращаемого значения.
  2. 6.10.2 Source file inclusion(англ.) WG14 N1570 Committee Draft. ISO/IEC (2011-04-12). Проверено 2012-11-19 г.
  3. 7.21 Input/output stdio.h(англ.) WG14 N1570 Committee Draft. ISO/IEC (2011-04-12). Проверено 2012-11-19 г.
  4. 5.1.2.2.1 Program startup(англ.) WG14 N1570 Committee Draft. ISO/IEC (2011-04-12). Проверено 2012-11-19 г.
  5. 7.21.7.9 The puts function(англ.) WG14 N1570 Committee Draft. ISO/IEC (2011-04-12). Проверено 2012-11-19 г.
  6. 5.1.2.2.3 Program termination(англ.) WG14 N1570 Committee Draft. ISO/IEC (2011-04-12). Проверено 2012-11-19 г.
  7. 7.22.4.4 The exit function(англ.) WG14 N1570 Committee Draft. ISO/IEC (2011-04-12). Проверено 2012-11-19 г.
  8. 7.21.6.1 The fprintf function(англ.) WG14 N1570 Committee Draft. ISO/IEC (2011-04-12). Проверено 2012-11-19 г.
  9. 5.2.2 Character display semantics(англ.) WG14 N1570 Committee Draft. ISO/IEC (2011-04-12). Проверено 2012-11-19 г.
  10. 7.21.7.6 The getchar function(англ.) WG14 N1570 Committee Draft. ISO/IEC (2011-04-12). Проверено 2012-11-19 г.