C - это язык программирования общего назначения, используемый для системного программирования (ОС и встраиваемых), библиотек, игр и кроссплатформенности. Этот тег следует использовать с общими вопросами, касающимися языка C, как это определено в стандарте ISO 9899 (последняя версия 9899: 2018, если не указано иное, а также для запросов, специфичных для версии, с c89, c99, c11 и т. Д.). C отличается от C ++ и не должен сочетаться с тэгом C ++ без разумной причины.
C (произносится как «см», как и буква C)- это язык программирования общего назначения, разработанный между 1969 и 1973 годы Деннис Ритчив Bell Telephone Laboratoriesдля использования с операционной системой UNIX. Его конструкция обеспечивает конструкции, которые эффективно отображаются на типичные машинные инструкции, и поэтому он нашел длительное применение в приложениях, которые ранее были написаны на ассемблере. Это высокоэффективный процедурный язык программирования, в котором особое внимание уделяется функциям, тогда как современные объектно-ориентированные языки программирования, как правило, подчеркивают данные.
Язык программирования C был на основеболее ранних языков программирования B, BCPL и CPL.
Язык C и его дополнительная библиотека стандартизированы как ISO / IEC 9899, текущей версией является ISO / IEC 9899: 2018 (C17). Черновая версия N2176доступно бесплатно.
Хотя C был разработан для реализации системного программного обеспечения, он также широко используется для разработки портативного прикладного программного обеспечения.
C является одним из наиболее широко используемых языков программирования всех времен, и существует очень мало компьютерных архитектур, для которых компилятор C не существует. C сильно повлиял на многие другие популярные языки программирования, особенно C ++, который начинался как расширение C. Другие языки, на которые C сильно повлияли, - это C #, Objective-C и Java.
Дизайн
C является обязательным (процедурным) языком реализации систем. Он был разработан для компиляции с использованием относительно простого компилятора, чтобы обеспечить низкоуровневый доступ к памяти, чтобы обеспечить языковые конструкции, которые эффективно сопоставляются с машинными инструкциями, и требовать минимальной поддержки во время выполнения. Поэтому C был полезен для многих приложений, которые ранее были написаны на ассемблере.
Несмотря на свои низкоуровневые возможности, язык был разработан для поддержки кроссплатформенного программирования. Совместимая со стандартами и портативно написанная C-программа может быть скомпилирована для очень широкого спектра компьютерных платформ и операционных систем с минимальными изменениями исходного кода. Язык стал доступен на очень широком спектре платформ, от встроенных микроконтроллеров до суперкомпьютеров.
cИспользование тегов
При публикации вопросов о программировании на С, обязательно указывайте:
- Информация о целевой системе и компиляторе. Это включает в себя имя компилятора, версию и настройки, используемые для компиляции.
- Если ваш вопрос касается ошибок / предупреждений компилятора, пожалуйста, процитируйте эти ошибки / предупреждения в вопросе. Также уточните, к какой строке относится ошибка компилятора.
- Если ваш вопрос относится к одной конкретной версии языка, добавьте c90c99c11или c17. Предварительно стандартные исторические вопросы должны быть помечены kr-c.
- Если в вопросе явно не указано, какая версия стандарта C используется, предполагается, что используется текущая версия. То есть, любая версия ISO 9899, которую ISO в настоящее время перечисляет как активную. Помните об этом, когда отвечаете или комментируете вопросы с тегами c.
Совместное использование cи c++
C и C ++ - это два разных и часто несовместимых языка. Избегайте использования обоих тегов в одном и том же вопросе, если у вас нет веских причин.
Вопрос должен быть помечен только c, если:
- Он содержит чистый C, без следов C ++ или вопросы с кодом, который может быть любым языком.
- Код компилируется с помощью компилятора Си.
Вопрос должен быть помечен только c++, если:
- Он содержит код с любыми функциями C ++. Хотя код может быть "стиль C".
- Код компилируется с помощью компилятора C ++.
Вопрос должен быть помечен как cи c++, если речь идет о:
- Конкретные различия между C и C ++.
- Совместимость или перенос кода между C и C ++.
- Код C ++, использующий библиотеки C (например, код, использующий
extern "C"
).
Правила редактирования и модерации для сообщений с тегами cи c++:
Чтобы редактировать / повторно помечать / модерировать вопросы с обоими тегами, рекомендуется, чтобы у вас были полные права редактирования и либо золотой c, либо золотой C ++значок .
Если вы столкнулись с сообщением с обоими тегами, отредактируйте / повторно пометите его, если необходимо, в соответствии с вышеуказанными правилами. Если вы можете сказать язык, прочитав опубликованный код, просто отредактируйте теги соответствующим образом. Избегайте подсказок пользователю "это C или C ++?" в комментариях, если вопрос действительно неясен.
Один пример неясного вопроса - когда пользователь явно заявляет, что он программирует на C, но публикует сообщения кода или компилятора для C ++. Если это так, запросите разъяснения и проведите закрытое голосование как неясное.
«С или С ++ - это хорошо», мнения ОП - явный признак плохого или неясного вопроса. Ответы могут быть очень разными в зависимости от выбранного языка. Запрашивать разъяснения, закрыть как неясные / слишком широкие, пока ФП не разъяснит это.
Будьте осторожны с повторной пометкой вопросов, когда будут опубликованы ответы, особенно если уже есть ответы на C и C ++. В таких случаях теги должны быть оставлены в покое, поскольку их изменение сделает опубликованные ответы недействительными.
Ответы с кодом C ++ на вопрос C, который никогда не был помечен как c++, должны быть удалены как не по теме. Пожалуйста, проверьте историю редактирования вопроса, прежде чем отмечать / удалять такие ответы, чтобы убедиться, что у вопроса никогда не было тега C ++.
Книги о С
О том, как использовать C., написано много разных книг разного качества. См. Вопрос Definitive C Book Guide и список.
Обратите внимание, что этот вопрос является спорным; это не будет принято в современном переполнении стека, но это полезный исторический артефакт, который все еще сохраняется.
Часто задаваемые вопросы (FAQ)
Типы и классификаторы
- Что такое строгое правило псевдонимов?
- Чар подписан или не подписан по умолчанию?
- Неявные правила продвижения типов
- В чем разница между const int *, const int * const и int const *?
Декларация и инициализация
- В чем разница между определением и декларацией?
- (Почему) использует неинициализированную переменную неопределенного поведения?
- Как инициализировать все члены массива одним и тем же значением?
Область применения и срок хранения
- Можно ли получить доступ к памяти локальной переменной вне ее области?
- Как использовать extern для обмена переменными между исходными файлами?
- Что означает «статический» в C?
Целочисленная арифметика
- Почему целочисленное переполнение без знака определяется поведением, а переполнение со знаком - нет?
- Как обнаружить переполнение кратного числа без знака?
- Каково поведение целочисленного деления?
- Что означает дополнительный 0 перед значение int означает? (восьмеричные константы)
Арифметика с плавающей точкой
- Почему числа с плавающей запятой неточные?
- C-программа для конвертации Фаренгейта в Цельсий (проблема целочисленного деления)
- Определено ли поведение приведения отрицательного двойного числа к unsigned int в стандарте C? Разное поведение на ARM против x86
Операторы, приоритет и порядок оценки
- Почему эти конструкции используют неопределенное поведение до и после приращения?
- C: В чем разница между ++ i и i ++?
- Обязательны ли короткие замыкания логических операторов? А порядок оценки?
- Почему с массивами, почему [5] == 5 [a]?
- Как вы устанавливаете, очищаете и переключаете один бит?
- Что такое операторы побитового сдвига (bit-shift) и как они работают?
- Что делает оператор запятой?
- Почему не работает +++++ b? ("maximal Правило Мунка ")
- Постинкремент для разыменованного указателя?(
*ptr++
вопросы приоритета ) - Объединение в цепочку нескольких операторов больше / меньше(часто задаваемые вопросы для начинающих этот "синтаксис интервала", такой как
0 < x < 10
, допустим C)
Loops
- Почему порядок циклов влияет на производительность при итерации по двумерному массиву?
- Это быстрее считать, чем считать?
Массивы
- Что такое массив для распада указателя?
- Является ли имя массива указателем?
- Почему размер параметра массива не такой же, как в main?
- Насколько опасен доступ к массиву за пределами?
- Получение исключения переполнения стека при объявлении большого массива
Указатели и ноль
- Как правильно написать код C / C ++, когда нулевой указатель не все биты ноль
- Как получить доступ к локальной переменной из другой функции, используя указатели?
- Как найти «sizeof» (указатель на массив)?
- Почему указатель int '++' увеличивается на 4, а не на 1?
- Указатель на уточнение указателя
- Сбой или «ошибка сегментации», когда данные копируются / сканируются / считываются в неинициализированный указатель
- Проблемы "Указатель от целого числа / целое число от указателя без приведения"
Функциональные указатели
Струны
- Как использовать массивы символов в качестве строк?Отсутствует нулевой терминатор ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ.
- Как правильно назначить новое строковое значение?
- Как правильно сравнить строки?
- В чем разница между char s [] и char * s?
- Почему я получаю ошибку сегментации при записи в строку, инициализированную "char * s", но не "char s []"?
- Почему strlcpy и strlcat считаются небезопасными?
- Строковые литералы: куда они идут?
- Как разбить строку на токены в C? (как использовать стрток)
Динамическое распределение памяти
- Я использую результат malloc?
- Динамический доступ к памяти работает только внутри функции
- Правильное размещение многомерных массивов
Структуры и союзы
- Почему sizeof для структуры не равен сумме sizeof каждого члена?
- Разделение структуры на частные и открытые разделы? (частная инкапсуляция с непрозрачным типом / непрозрачные указатели)
- Typedefs, теговые и нетегированные структуры и несовместимые типы указателей
- sizeof () структура с членом массива нулевой длины
Препроцессор и макросы
Соответствие стандарту
- Что должно возвращать main () в C и C ++?
- Где я могу найти текущие стандартные документы C или C ++?
- В чем разница между C, C99, ANSI C и GNU C?
Неопределенное, неопределенное и определяемое реализацией поведение
- Неопределенное, неопределенное и определяемое реализацией поведение
- Окончательный список распространенных причин ошибок сегментации
- Что такое ошибка шины?
Стандартная библиотека
Лучшие практики и проблемы стиля
- Почему звездочка перед именем переменной, а не после типа?
- "static const" против "#define" против "enum"
- Это хорошая идея, чтобы печатать указатели?
- Что представляет собой тип, за которым следует _t (underscore-t)?
Внешние ресурсы
- FAQ по comp.lang.cсодержит ответы на многие часто задаваемые вопросы о Си. Например, см. Правило по часовой стрелке / спиральдля разбора объявлений C.
- Справочник по Сисодержит ссылку на язык Си и стандартные функции библиотеки.
- Что каждый компьютерный ученый должен знать об арифметике с плавающей точкой, автор David Goldberg
- cdecl: C gibberish ↔ English, сайт, переводящий выражения C на читаемый английский.
Программа Hello World на C
#include <stdio.h>
int main(void)
{
printf("hello, world\n");
return 0;
}
Комната чата
Поговорите о C с другими пользователями Stack Overflow
Интернет-компиляторы
- Repl.it C компилятор
- OnlineGDB C компилятор
- Tutorialspoint C компилятор
- Godbolt - C компилятор проводника / дизассемблер