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

Содержимое удалено Содержимое добавлено
Элемент <ref /> и шаблон {{Примечания|}} заменяет шаблоны {{ref|}} и {{note|}}.
Выделены два подраздела; дополнения; ссылки на стандарт.
Строка 1:
{{Содержание «Язык Си в примерах»}}
 
== Вариант «простой» ==
== Здравствуй, мир! ==
 
Первая программа, которую мы рассмотрим, — это «Hello World» — программа, которая выведет на экран строчкустроку текста «Hello, World!» («Здравствуй, мир!») и закончит своё выполнение.
<source lang="c">
#include <stdio.h>
Строка 9:
int main (void)
{
printfputs ("Hello, World!\n");
return 0;
}
</source>
 
Посмотрим на неё внимательно. Первая строчкастрока
<source lang="c">
#include <stdio.h>
Строка 29:
что значит: «функция с именем <code>main</code>, которая возвращает целое число (число типа <code>int</code> от англ. {{lang|en|[[wikt:integer#integer I (существительное)|integer]]}}) и у которой нет аргументов <code>(void)</code>»
 
<small>В качестве варианта, [[w:C11|стандарт]] допускает определение функции <code>main</code> как функции двух аргументов (<code>int argc</code> и <code>char *argv[]</code> — имена, разумеется, могут быть произвольными), что используется для получения доступа к ''аргументам командной строки'' из программы. В данном случае, эта возможность не требуется, поэтому функция определена как безаргументная (что также явно разрешено стандартом.)<ref name="startup" >[http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf#page=31 WG14 N1570 Committee Draft — April 12, 2011] 5.1.2.2.1 ''Program Startup''</ref></small>
 
Английское слово {{lang|en|[[wikt:void#существительное|void]]}} можно перевести как «ничто». Далее открываются фигурные скобки и идёт ''тело'' функции, в конце фигурные скобки закрываются. Функция <code>main</code> — главная функция программы, именно с нее начинается выполнение программы.
Строка 35:
Тело функции, в свою очередь, определяет последовательность действий, выполняемых данной функцией — логику функции. Наша функция выполняет одно единственное действие:
<source lang="c">
printfputs ("Hello, world!\n");
</source>
 
Это действие, в свою очередь, есть вызов функции <code>printfputs</code> стандартной библиотеки.<ref name="puts" >[http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf#page=351 WG14 N1570 Committee Draft — April 12, 2011] 7.21.7.9 ''The puts function''</ref> В результате выполнения этой функции, на [[w:Стандартные потоки#Стандартный вывод|стандартный вывод]] (которым, скорее всего, окажется экран или окно на экране) печатается текстстрока <code>Hello, world!</code>. Обратите внимание на комбинацию <code>"\n"</code> — она задаёт специальный символ, который в действительности является командой текстовому терминалу: «перейти на следующую строку». Таких специальных символов несколько, все они записываются с помощью символа [[w:Обратная косая черта|обратной косой черты]] <code>\</code> (см. [[Базовые понятия языка Си/Специальные символы]], [[../ASCII коды символов]]).
 
Затем идёт команда <code>return 0;</code>, которая завершает выполнение функции и возвращает значение 0, определяемое стандартом (для функции <code>main</code>) как код «успешного завершения».<ref name="termination" >[http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf#page=32 WG14 N1570 Committee Draft — April 12, 2011] 5.1.2.2.3 ''Program termination''</ref><ref name="exit" >[http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf#page=369 WG14 N1570 Committee Draft — April 12, 2011] 7.22.4.4 ''The exit function''</ref>
 
Функция <code>main</code> должна возвращать 0, если выполнение прошло успешно.
== Вариант «классический» ==
 
Этот вариант отличается использованием функций <code>printf</code> (вместо <code>puts</code>) и <code>getchar</code>.
 
Окружение, в котором запускается программа, как правило можно настроить так, что вывод программы будет оставаться на экране после ее выполнения неограниченно долго. Проще всего это обеспечить вызывая программу из [[w:Интерпретатор командной строки|командного интерпретатора]] (который, в свою очередь, может быть запущен в окне [[w:Эмулятор терминала|эмулятора терминала]]) или (в зависимости от системы) окна [[w:Cmd.exe|Cmd.exe]]. При запуске непосредственно из графического окружения, перед завершением функции <code>main</code> командой <code>return</code> можно добавить функцию, ожидающую ввода пользователя, например — <code>getchar</code> (также объявленную в уже используемом <code>stdio.h</code>):
<source lang="c">
#include <stdio.h>
 
int main (void)
{
printf ("Hello, World!\n");
getchar ();
return 0;
}
</source>
 
В отличие от функции <code>puts</code>, выводящей переданную в качестве аргумента символьную строку, первый и обязательный аргумент функции <code>printf</code> определяет ''формат'' вывода.<ref name="fprintf" >[http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf#page=327 WG14 N1570 Committee Draft — April 12, 2011] 7.21.6.1 ''The fprintf function''</ref>
<small>В некоторых руководствах для этой же цели используется функция <code>getch</code>. Однако, эта функция (в отличие от <code>getchar</code>) не является частью стандартной библиотеки и, к тому же, зависима от платформы. Так, в некоторых системах использование <code>getch</code> требует включения файла <code>curses.h</code> и предшествующего вызова функции <code>initscr</code>. В других системах, однако, <code>getch</code> может быть объявлена в <code>conio.h</code>, и выполнение <code>initscr</code> — не требуется.</small>
 
<small>В общем случае, формат состоит из произвольного текста (не включающего символ <code>%</code>) «перемешанного» с ''указателями преобразований'' (предваряемыми символом <code>%</code>). В данном случае, однако, эта возможность не используется и никаких преобразований не выполняется.</small>
 
Обратите внимание на появившуюся в ''строковой константе'' комбинацию <code>\n</code> — она включает в выводимую строку [[w:Управляющие символы|управляющий код]] (или ''управляющий символ'') [[w:Перевод строки|перевода]] (также ''разрыва'' или ''завершения'') строки. В отличие от функции <code>puts</code>, всегда добавляющей этот код к выводимой строке, <code>printf</code> требует явного его указания.
 
<small>Действующая редакция стандарта определяет ''семь'' таких комбинаций, причем все они записываются с помощью символа [[w:Обратная косая черта|обратной косой черты]] <code>\</code> (см. [[Базовые понятия языка Си/Специальные символы]], [[../ASCII коды символов]]).<ref name="cds" >[http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf#page=42 WG14 N1570 Committee Draft — April 12, 2011] 5.2.2 ''Character display semantics''</ref></small>
 
Обратим внимание и на следующее новшество:
<source lang="c">
getchar ();
</source>
 
Окружение, в котором запускается программа, как правило можно настроить так, что вывод программы будет оставаться на экране после ее выполнения неограниченно долго. Проще всего это обеспечить вызывая программу из [[w:Интерпретатор командной строки|командного интерпретатора]] (который, в свою очередь, может быть запущен в окне [[w:Эмулятор терминала|эмулятора терминала]]) или (в зависимости от системы) окна [[w:Cmd.exe|Cmd.exe]]. При запуске непосредственно из графического окружения, перед завершением функции <code>main</code> командой <code>return</code> можно добавить функцию, ожидающую ввода пользователя, например — <code>getchar</code> (также объявленную в уже используемом <code>stdio.h</code>):
 
При запуске непосредственно из графического окружения, однако, отведенное программе окно может закрыться сразу же после завершение программы. Функция <code>getchar</code><ref name="getchar" >[http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf#page=350 WG14 N1570 Committee Draft — April 12, 2011] 7.21.7.6 ''The getchar function''</ref> ожидает ввод пользователя, тем самым «откладывая» завершение программы (<code>return</code>). Какие именно действия могут прервать это ожидание — зависит от системы, однако можно надеяться, что нажатие клавиши [[w:Клавиша ввода|⏎ Enter]] завершит эту функцию в любой системе.
 
<small>В некоторых руководствах для этой же цели используетсяпредлагается функция <code>getch</code>. Однако, эта функция (в отличие от <code>getchar</code>) не является частью ''стандартной библиотеки'' и, к тому же, зависима от платформы. Так, в некоторых системах использование <code>getch</code> требует включения файла <code>curses.h</code> и предшествующего вызова функции <code>initscr</code>. В других системах, однако, <code>getch</code> может быть объявлена в <code>conio.h</code>, и выполнение <code>initscr</code> — не требуется.</small>
 
== Примечания ==
{{Примечания | refs = <ref name="include">В действительности, <code>#include <...></code> есть директива препроцессора, то есть команда, которая выполняется до начала компиляции файла. Смысл этой директивы очень прост и заключается в том, чтобы на место, где указана эта директива, вставить содержимое файла, имя которого указано в угловых скобках. Обычно заголовочные файлы содержат только [[w:Прототип функции|прототипы функций]], то есть просто список функций с указанием аргументов и типа возвращаемого значения.</ref>}}
 
[[Категория:Язык Си в примерах|Простейшая программа «Hello World»{{SUBPAGENAME}}]]