C Language учебник
Начало работы с языком C
Поиск…
замечания
C - универсальный, императивный язык программирования, поддерживающий структурированное программирование, лексическую переменную область и рекурсию, а система статического типа предотвращает многие непреднамеренные операции. По дизайну C предоставляет конструкции, которые эффективно сопоставляются с типичными машинными инструкциями, и поэтому он нашел долгосрочное применение в приложениях, которые ранее были закодированы на языке ассемблера, включая операционные системы, а также различное прикладное программное обеспечение для компьютеров от суперкомпьютеров до встроенных систем ,
Несмотря на свои низкоуровневые возможности, язык был разработан для поощрения кросс-платформенного программирования. Стандартно-совместимая и портативно написанная программа C может быть скомпилирована для очень широкого спектра компьютерных платформ и операционных систем с небольшими изменениями в ее исходном коде. Язык стал доступен на очень широком спектре платформ - от встроенных микроконтроллеров до суперкомпьютеров.
C был первоначально разработан Деннисом Ричи в период с 1969 по 1973 год в Bell Labs и использовался для повторной реализации операционных систем Unix . С тех пор он стал одним из наиболее широко используемых языков программирования всех времен, причем компиляторы C из разных поставщиков доступны для большинства существующих компьютерных архитектур и операционных систем.
Общие компиляторы
Процесс компиляции программы C отличается между компиляторами и операционными системами. Большинство операционных систем поставляются без компилятора, поэтому вам придется его установить. Некоторые общие варианты компиляторов:
- GCC, сборник компиляторов GNU
- clang: интерфейс семейства языков C для LLVM
- Инструменты сборки MSVC, Microsoft Visual C / C ++
Следующие документы должны дать вам хороший обзор о том, как начать работу с использованием нескольких наиболее распространенных компиляторов:
Поддержка версии компилятора C
Обратите внимание, что компиляторы имеют различные уровни поддержки для стандартного C, многие из которых еще не полностью поддерживают C99. Например, с момента выпуска в 2015 году MSVC поддерживает большую часть C99, но все же имеет некоторые важные исключения для поддержки самого языка (например, препроцессинг кажется несоответствующим) и для библиотеки C (например, <tgmath.h>
), а также они обязательно документируют свои «варианты, зависящие от реализации». В Википедии есть таблица, показывающая поддержку, предлагаемую некоторыми популярными компиляторами.
Некоторые компиляторы (особенно GCC) предлагали или продолжают предлагать расширения для компилятора, которые реализуют дополнительные функции, которые производители компиляторов считают необходимыми, полезными или верят, могут стать частью будущей версии C, но в настоящее время они не являются частью любого стандарта C. Поскольку эти расширения специфичны для компилятора, их можно считать несовместимыми, а разработчики компилятора могут удалить или изменить их в более поздних версиях компилятора. Использование таких расширений обычно можно контролировать с помощью флагов компилятора.
Кроме того, у многих разработчиков есть компиляторы, которые поддерживают только определенные версии C, налагаемые средой или платформой, на которую они нацелены.
При выборе компилятора рекомендуется выбрать компилятор, который наилучшим образом поддерживает последнюю версию C, разрешенную для целевой среды.
Стиль кода (вне темы здесь):
Поскольку пробел в C невелик (то есть он не влияет на работу кода), программисты часто используют пробел, чтобы сделать код более понятным и понятным, это называется стилем кода . Это набор правил и рекомендаций, используемых при написании исходного кода. Он охватывает такие проблемы, как то, как строки должны быть отступом, должны ли использоваться пробелы или вкладки, как должны быть размещены фигурные скобки, как пространства должны использоваться вокруг операторов и скобок, как переменные должны быть названы и так далее.
Стиль кода не покрывается стандартом и в основном основан на мнениях (разные люди находят разные стили более легкими для чтения), поэтому он обычно считается вне темы на SO. Превосходный совет по стилю в собственном коде состоит в том, что последовательность является первостепенной - выбирайте или создавайте стиль и придерживайтесь его. Достаточно пояснить, что в общем использовании существуют разные именованные стили, которые часто выбирают программисты, а не создают их собственный стиль.
Некоторые общие стили отступа: стиль K & R, стиль Allman, стиль GNU и так далее. Некоторые из этих стилей имеют разные варианты. Например, Allman используется как обычный Allman или популярный вариант Allman-8. Информацию о некоторых популярных стилях можно найти в Википедии . Такие имена стиля берутся из стандартов, которые авторы или организации часто публикуют для использования многими людьми, способствующими их коду, чтобы каждый мог легко прочитать код, когда он знает стиль, например, руководство по форматированию GNU, которое составляет часть документ стандартов кодирования GNU .
Некоторые общие соглашения об именах: UpperCamelCase, lowerCamelCase, lower_case_with_underscore, ALL_CAPS и т. Д. Эти стили объединяются различными способами для использования с разными объектами и типами (например, макросы часто используют стиль ALL_CAPS)
Стиль K & R обычно рекомендуется для использования в документации SO, тогда как более эзотерические стили, такие как Pico, обескуражены.
Библиотеки и API, не охваченные стандартом C (и, следовательно, не относящиеся к теме):
Версии
Версия | стандарт | Дата публикации |
---|---|---|
К & Р | н / | 1978-02-22 |
C89 | ANSI X3.159-1989 | 1989-12-14 |
C90 | ISO / IEC 9899: 1990 | 1990-12-20 |
C95 | ISO / IEC 9899 / AMD1: 1995 | 1995-03-30 |
C99 | ISO / IEC 9899: 1999 | 1999-12-16 |
C11 | ISO / IEC 9899: 2011 | 2011-12-15 |
Привет, мир
Чтобы создать простую программу на C, которая выводит на экран «Hello, World» , используйте текстовый редактор для создания нового файла (например, hello.c
- расширение файла должно быть .c
), содержащее следующий исходный код:
Привет
#include <stdio.h>
int main(void)
{
puts("Hello, World");
return 0;
}
Давайте посмотрим на эту простую программу за строкой
#include <stdio.h>
Эта строка сообщает компилятору включить в стандартный stdio.h
содержимое стандартного файла stdio.h
библиотеки. Заголовки обычно представляют собой файлы, содержащие объявления функций, макросы и типы данных, и вы должны включать заголовочный файл перед их использованием. Эта строка включает stdio.h
поэтому она может вызывать функцию puts()
.
int main(void)
Эта строка начинает определение функции. В нем указано имя функции ( main
), тип и количество ожидаемых аргументов ( void
, значение none) и тип значения, возвращаемого этой функцией ( int
). Выполнение программы начинается с функции main()
.
{
…
}
Кудрявые фигурные скобки используются парами, чтобы указать, где начинается и заканчивается блок кода. Их можно использовать многими способами, но в этом случае они указывают, где начинается и заканчивается функция.
puts("Hello, World");
Эта строка вызывает функцию puts()
для вывода текста на стандартный вывод (по умолчанию - экран), за которым следует новая строка. Строка, которая будет выводиться, включена в круглые скобки.
"Hello, World"
- это строка, которая будет записана на экран. В C каждое строковое литеральное значение должно быть внутри двойных кавычек "…"
.
В C-программах каждое утверждение должно заканчиваться точкой с запятой (т.е ;
).
return 0;
Когда мы определили main()
, мы объявили его как функцию, возвращающую int
, то есть нужно вернуть целое число. В этом примере мы возвращаем целочисленное значение 0, которое используется для указания успешного выхода программы. После return 0;
, процесс выполнения завершится.
Редактирование программы
Простые текстовые редакторы включают vim
или gedit
в Linux или Notepad
в Windows. Кросс-платформенные редакторы также включают Visual Studio Code
или Sublime Text
.
Редактор должен создавать текстовые текстовые файлы, а не RTF или другой другой формат.
Компиляция и запуск программы
Для запуска программы этот исходный файл ( hello.c
) сначала необходимо скомпилировать в исполняемый файл (например, hello
в системе Unix / Linux или hello.exe
в Windows). Это делается с использованием компилятора для языка C.
Компилировать с использованием GCC
GCC (сборник компиляторов GNU) - широко используемый компилятор C. Чтобы использовать его, откройте терминал, используйте командную строку, чтобы перейти к местоположению исходного файла, а затем запустите:
gcc hello.c -o hello
Если в исходном коде ( hello.c
) не обнаружены ошибки, компилятор создаст двоичный файл , имя которого задается аргументом в параметре командной строки -o
( hello
). Это окончательный исполняемый файл.
Мы также можем использовать параметры предупреждения -Wall -Wextra -Werror
, которые помогают выявлять проблемы, которые могут привести к сбою программы или возникновению неожиданных результатов. Они не нужны для этой простой программы, но это способ их добавления:
gcc -Wall -Wextra -Werror -o hello hello.c
Использование компилятора clang
Чтобы скомпилировать программу, используя clang
вы можете использовать:
clang -Wall -Wextra -Werror -o hello hello.c
По дизайну параметры командной строки clang
аналогичны параметрам GCC.
Использование компилятора Microsoft C из командной строки
При использовании компилятора Microsoft cl.exe
в системе Windows, которая поддерживает Visual Studio, и если все переменные среды установлены, этот пример C может быть скомпилирован с использованием следующей команды, которая приведет к выполнению исполняемого файла hello.exe
в каталоге, в котором выполняется команда (Существуют опции предупреждения, такие как /W3
для cl
, примерно аналогичные -Wall
т. Д. Для GCC или clang).
cl hello.c
Выполнение программы
После компиляции двоичный файл может быть выполнен, введя ./hello
в терминал. После выполнения скомпилированная программа напечатает Hello, World
, а затем новую строку, в командной строке.
Оригинал «Привет, мир!» в K & R C
Ниже приводится оригинал «Hello, World!». программа из книги «Язык программирования C » Брайана Кернигана и Денниса Ричи (Ritchie был оригинальным разработчиком языка программирования C в Bell Labs), называемым «K & R»:
#include <stdio.h>
main()
{
printf("hello, world\n");
}
Обратите внимание, что язык программирования C не был стандартизован во время написания первого издания этой книги (1978) и что эта программа, вероятно, не будет компилироваться на большинстве современных компиляторов, если они не будут проинструктированы принять код C90.
Этот самый первый пример в книге K & R теперь считается некачественным, отчасти потому, что ему не хватает явного типа возврата для main()
а частично потому, что ему не хватает оператора return
. Второе издание книги было написано для старого стандарта C89. В C89 тип main
будет по умолчанию для int
, но пример K & R не возвращает определенное значение в среду. В стандартах C99 и более поздних версиях требуется тип возврата, но безопасно исключить оператор return
main
(и только main
) из-за специального случая, введенного с C99 5.1.2.2.3, - это эквивалентно возврату 0 , что указывает на успех.
Рекомендуемая и наиболее переносимая форма main
для размещенных систем - int main (void)
когда программа не использует аргументы командной строки или int main(int argc, char **argv)
когда программа использует аргументы командной строки.
C90 §5.1.2.2.3 Окончание программы
Возврат от начального вызова к
main
функции эквивалентен вызову функцииexit
со значением, возвращаемымmain
функцией в качестве аргумента. Еслиmain
функция выполняет возврат, который не задает значения, статус завершения, возвращаемый в среду хоста, не определен.
C90 §6.6.6.4 Оператор return
Если выполняется оператор
return
без выражения, а значение вызова функции используется вызывающим, поведение не определено. Достижение}
которое завершает функцию, эквивалентно выполнению оператораreturn
без выражения.
C99 §5.1.2.2.3 Окончание программы
Если тип возврата
main
функции является типом, совместимым сint
, возврат от начального вызова кmain
функции эквивалентен вызову функцииexit
со значением, возвращаемымmain
функцией в качестве аргумента; достигая}
который завершаетmain
функцию, возвращает значение 0. Если тип возврата несовместим сint
, статус завершения, возвращаемый в среду хоста, не указан.