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

Содержимое удалено Содержимое добавлено
м {{BookCat}}; избыточные <big /> и <font /> вокруг <source />; пробелы.
Оформление, уточнения; →‎Примечания: перенесены <ref /> в данный раздел; использован {{Cite web|}}.
Строка 9:
int main (void)
{
puts ("Hello, World!");
return 0;
}
</source>
 
Посмотрим на неё внимательно. Первая строка — <source lang="c" enclose="none" >#include <stdio.h></source> —
означает «включи файл''заголовок'' <code >stdio.h</code>». В этом файлезаголовке ''объявляются'' функции, связанные с вводом и выводом данных.<ref name="include-c" /><ref name="include" />
<source lang="c">
#include <stdio.h>
</source>
означает «включи файл <code>stdio.h</code>». В этом файле ''объявляются'' функции, связанные с вводом и выводом данных.
 
Аббревиатуру ''stdio'' можно перевести как ''стандартнаястандартный библиотека вводаввод-выводавывод'' (англ. {{lang |en|standard input/output library}}). Буква «h» после точки означает ''заголовок'' (англ. {{lang |en|[[wikt:header#Английский |header]]}}). В заголовках (которые нередко<em >как правило</em> представлены отдельными ''заголовочными файлами'') обычно объявляются предоставляемые соответствующими им библиотеками функции, типы данных, константы и определения препроцессора.<ref name="includestdio.h" />
 
Далее идёт функция''определение'' функции <code >main</code>. Она Оно начинается с ''объявления'':
<source lang="c">
int main (void)
Строка 28 ⟶ 25 :
что значит: «функция с именем <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> — главная функция программы, именно с нее начинается выполнение программы.
Строка 34 ⟶ 31 :
Тело функции, в свою очередь, определяет последовательность действий, выполняемых данной функцией — логику функции. Наша функция выполняет одно единственное действие:
<source lang="c">
puts ("Hello, world!");
</source>
 
Это действие, в свою очередь, есть вызов функции <code >puts</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 >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>
 
== Вариант «классический» ==
Строка 48 ⟶ 45 :
#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>%</code>) «перемешанного» с ''указателями преобразований'' (предваряемыми символом <code>%</code>). В данном случае, однако, эта возможность не используется и никаких преобразований не выполняется.</small>
Строка 62 ⟶ 60 :
Обратите внимание на появившуюся в ''строковой константе'' комбинацию <code>\n</code> — она включает в выводимую строку [[w:Управляющие символы|управляющий код]] (или ''управляющий символ'') [[w:Перевод строки|перевода]] (также ''разрыва'' или ''завершения'') строки. В отличие от функции <code>puts</code>, всегда добавляющей этот код к выводимой строке, <code>printf</code> требует явного его указания.
 
<small >Действующая редакция стандарта определяет ''<em >семь''</em> таких комбинаций, причем все они записываются с помощью символа [[w:Обратная косая черта |обратной косой черты]] <code >\</code> (см. [[../ASCII коды символов/]]).<ref name="cds" >[http://www.openchar-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 >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>
Строка 82 ⟶ 80 :
#include <windows.h>
 
int
main (void)
{
MessageBox (0, "Hello, World!",
"Message", MB_OK);
return 0;
}
</source>
 
Использование заголовка <code>windows.h</code> может произвести впечатление приемлемости этого варианта кода в рамках только лишь [[w:Microsoft Windows|одной конкретной]] системы. Однако, для использованного здесь [[w:Интерфейс программирования приложений|интерфейса]] существует и независимая [[w:Свободное программное обеспечение|свободная]] реализация — [[w:Wine|Wine]], — позволяющая [[../Компиляция программ|собрать]] и выполнить данный вариант на таких системах, как, например, [[w:Linux|GNU/Linux]], [[w:FreeBSD|FreeBSD]], [[w:Solaris|Solaris]] и [[w:Mac OS X|Mac OS X]].
 
== См. также ==
* {{w |Hello, world!}}
* {{w |C11}}
* {{w |Wine}}
 
== Примечания ==
{{Примечания | refs =
{{Примечания | refs = <ref name="include">В действительности, <code>#include <...></code> — это директива препроцессора, то есть команда, которая выполняется до начала компиляции файла. Смысл этой директивы очень прост и заключается в том, чтобы на место, где указана эта директива, вставить содержимое файла, имя которого указано в угловых скобках. Обычно заголовочные файлы содержат только [[w:Прототип функции|прототипы функций]], то есть просто список функций с указанием аргументов и типа возвращаемого значения.</ref>}}
<!-- Пожалуйста поддерживайте алфавитный порядок для name. Спасибо. -->
<ref name="char-display" >{{Cite web | title = 5.2.2 Character display semantics | url = http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf#page=42 | work = WG14 N1570 Committee Draft | publisher = ISO/IEC | datepublished = 2011-04-12 | lang = en | accessdate = 2012-11-19}}</ref>
<ref name="exit" >{{Cite web | title = 7.22.4.4 The exit function | url = http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf#page=369 | work = WG14 N1570 Committee Draft | publisher = ISO/IEC | datepublished = 2011-04-12 | lang = en | accessdate = 2012-11-19}}</ref>
<ref name="fprintf" >{{Cite web | title = 7.21.6.1 The fprintf function | url = http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf#page=327 | work = WG14 N1570 Committee Draft | publisher = ISO/IEC | datepublished = 2011-04-12 | lang = en | accessdate = 2012-11-19}}</ref>
<ref name="getchar" >{{Cite web | title = 7.21.7.6 The getchar function | url = http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf#page=350 | work = WG14 N1570 Committee Draft | publisher = ISO/IEC | datepublished = 2011-04-12 | lang = en | accessdate = 2012-11-19}}</ref>
<ref name="include" >{{Cite web | title = 6.10.2 Source file inclusion | url = http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf#page=182 | work = WG14 N1570 Committee Draft | publisher = ISO/IEC | datepublished = 2011-04-12 | lang = en | accessdate = 2012-11-19}}</ref>
{{Примечания | refs = <ref name="include-c" >В действительности, <code>#include <...></code> — это директива препроцессора, то есть команда, которая выполняется до начала компиляции файла. Смысл этой директивы очень прост и заключается в том, чтобы на место, где указана эта директива, вставить содержимое файла, имя которого указано в угловых скобках. Обычно заголовочные файлы содержат только [[w:Прототип функции |прототипы функций]], то есть просто список функций с указанием аргументов и типа возвращаемого значения.</ref>}}
<ref name="puts" >{{Cite web | title = 7.21.7.9 The puts function | url = http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf#page=351 | work = WG14 N1570 Committee Draft | publisher = ISO/IEC | datepublished = 2011-04-12 | lang = en | accessdate = 2012-11-19}}</ref>
<ref name="startup" >{{Cite web | title = 5.1.2.2.1 Program startup | url = http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf#page=31 | work = WG14 N1570 Committee Draft | publisher = ISO/IEC | datepublished = 2011-04-12 | lang = en | accessdate = 2012-11-19}}</ref>
<ref name="stdio.h" >{{Cite web | title = 7.21 Input/output <code >stdio.h</code> | url = http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf#page=314 | work = WG14 N1570 Committee Draft | publisher = ISO/IEC | datepublished = 2011-04-12 | lang = en | accessdate = 2012-11-19}}</ref>
<ref name="termination" >{{Cite web | title = 5.1.2.2.3 Program termination | url = http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf#page=32 | work = WG14 N1570 Committee Draft | publisher = ISO/IEC | datepublished = 2011-04-12 | lang = en | accessdate = 2012-11-19}}</ref>
}}
 
{{BookCat}}