Язык Си в примерах/Простейшая программа «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 (2011-04-12). Проверено 2012-11-19 г.
- ↑ 7.21 Input/output
stdio.h
(англ.) WG14 N1570 Committee Draft. ISO/IEC (2011-04-12). Проверено 2012-11-19 г. - ↑ 5.1.2.2.1 Program startup(англ.) WG14 N1570 Committee Draft. ISO/IEC (2011-04-12). Проверено 2012-11-19 г.
- ↑ 7.21.7.9 The puts function(англ.) WG14 N1570 Committee Draft. ISO/IEC (2011-04-12). Проверено 2012-11-19 г.
- ↑ 5.1.2.2.3 Program termination(англ.) WG14 N1570 Committee Draft. ISO/IEC (2011-04-12). Проверено 2012-11-19 г.
- ↑ 7.22.4.4 The exit function(англ.) WG14 N1570 Committee Draft. ISO/IEC (2011-04-12). Проверено 2012-11-19 г.
- ↑ 7.21.6.1 The fprintf function(англ.) WG14 N1570 Committee Draft. ISO/IEC (2011-04-12). Проверено 2012-11-19 г.
- ↑ 5.2.2 Character display semantics(англ.) WG14 N1570 Committee Draft. ISO/IEC (2011-04-12). Проверено 2012-11-19 г.
- ↑ 7.21.7.6 The getchar function(англ.) WG14 N1570 Committee Draft. ISO/IEC (2011-04-12). Проверено 2012-11-19 г.