Язык Си в примерах/Простейшая программа «Hello World»
- Компиляция программ
- Простейшая программа «Hello World»
- Учимся складывать
- Максимум
- Таблица умножения
- ASCII-коды символов
- Верхний регистр
- Скобочки
- Факториал
- Степень числа
- Треугольник Паскаля
- Корень уравнения
- Система счисления
- Сортировка
- Библиотека complex
- Сортировка на основе qsort
- RPN-калькулятор
- RPN-калькулятор на Bison
- Простая грамматика
- Задача «Расчёт сопротивления схемы»
- Простая реализация конечного автомата
- Использование аргументов командной строки
- Чтение и печать без использования stdio
- Декодирование звукозаписи в формате ADX
- Другие примеры
- 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.
См. также
[править]Примечания
[править]- ↑ В действительности,
#include <...>— это директива препроцессора, то есть команда, которая выполняется до начала компиляции файла. Смысл этой директивы очень прост и заключается в том, чтобы на место, где указана эта директива, вставить содержимое файла, имя которого указано в угловых скобках. Обычно заголовочные файлы содержат только прототипы функций, то есть просто список функций с указанием аргументов и типа возвращаемого значения. - ↑ 6.10.2 Source file inclusion (англ.). WG14 N1570 Committee Draft. ISO/IEC (12 апреля 2011). Дата обращения: 19 ноября 2012.
- ↑ 7.21 Input/output
stdio.h(англ.). WG14 N1570 Committee Draft. ISO/IEC (12 апреля 2011). Дата обращения: 19 ноября 2012. - ↑ 5.1.2.2.1 Program startup (англ.). WG14 N1570 Committee Draft. ISO/IEC (12 апреля 2011). Дата обращения: 19 ноября 2012.
- ↑ 7.21.7.9 The puts function (англ.). WG14 N1570 Committee Draft. ISO/IEC (12 апреля 2011). Дата обращения: 19 ноября 2012.
- ↑ 5.1.2.2.3 Program termination (англ.). WG14 N1570 Committee Draft. ISO/IEC (12 апреля 2011). Дата обращения: 19 ноября 2012.
- ↑ 7.22.4.4 The exit function (англ.). WG14 N1570 Committee Draft. ISO/IEC (12 апреля 2011). Дата обращения: 19 ноября 2012.
- ↑ 7.21.6.1 The fprintf function (англ.). WG14 N1570 Committee Draft. ISO/IEC (12 апреля 2011). Дата обращения: 19 ноября 2012.
- ↑ 5.2.2 Character display semantics (англ.). WG14 N1570 Committee Draft. ISO/IEC (12 апреля 2011). Дата обращения: 19 ноября 2012.
- ↑ 7.21.7.6 The getchar function (англ.). WG14 N1570 Committee Draft. ISO/IEC (12 апреля 2011). Дата обращения: 19 ноября 2012.