Описание тега c
C (произносится как "See", как буква 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 Использование тегов
Публикуя вопросы о программировании на C, не забудьте указать:
- Информация о целевой системе и компиляторе. Сюда входят имя компилятора, версия и настройки, используемые для компиляции.
- Если ваш вопрос касается ошибок / предупреждений компилятора, укажите эти ошибки / предупреждения в вопросе. Также уточните, к какой строке относится ошибка компилятора.
- Если ваш вопрос относится к одной конкретной версии языка, добавьте c90 c99 c11 или 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++, использующий библиотеки C (например, код, использующий
extern "C"
).
Рекомендации по редактированию и модерации сообщений с тегами c и C++:
Чтобы редактировать / изменять теги / модерировать вопросы с обоими тегами, рекомендуется, чтобы у вас были полные права редактирования и либо золотой значок c, либо золотой значок C++.
Если вы встретили сообщение с обоими тегами, при необходимости отредактируйте / поменяйте теги в соответствии с приведенными выше правилами. Если вы можете определить язык, прочитав опубликованный код, просто отредактируйте теги соответствующим образом. Избегайте спрашивать пользователя "это C или C++?" в комментариях, если вопрос действительно неясен.
Один из примеров неясного вопроса - это когда пользователь явно заявляет, что он программирует на C, но публикует код или сообщения компилятора для C++. Если да, запросите разъяснения и завершите голосование как неясное.
Мнения OP "Либо C, либо C++ в порядке" - явный признак плохого или неясного вопроса. Ответы могут сильно отличаться в зависимости от выбранного языка. Запросить разъяснения, закрыть как неясное / слишком широкое, пока ОП не разъяснит это.
Будьте осторожны с повторной пометкой вопросов после публикации ответов, особенно если уже опубликованы ответы на C и C++. В таких случаях теги следует оставить в покое, поскольку их изменение сделает опубликованные ответы недействительными.
Ответы с кодом C++ на вопрос C, который никогда не был помечен как C++, следует удалить как не по теме. Пожалуйста, проверьте историю редактирования вопроса, прежде чем отмечать / удалять такие ответы, чтобы убедиться, что у вопроса никогда не было тега C++.
Книги о C
Существует много-много книг разного качества о том, как использовать C. См. Вопрос " Руководство и список книг на C".
Обратите внимание, что этот вопрос спорный; он не будет принят в современном stackru, но это полезный исторический артефакт, который все еще поддерживается.
Часто задаваемые вопросы (FAQ)
Типы и квалификаторы
- Какое правило строгого псевдонима?
- По умолчанию char подписан или неподписан?
- Правила повышения неявного типа
- В чем разница между const int*, const int * const и int const *?
Объявление и инициализация
- В чем разница между определением и декларацией?
- (Почему) использует неопределенное поведение неинициализированной переменной?
- Как инициализировать все элементы массива одинаковым значением?
Объем и срок хранения
- Можно ли получить доступ к памяти локальной переменной вне ее области?
- Как использовать extern для обмена переменными между исходными файлами?
- Что означает "статический" в C?
Целочисленная арифметика
- Почему переполнение целого числа без знака определяется поведением, а переполнение целого числа со знаком - нет?
- Как определить переполнение беззнакового целочисленного умножения?
- Как ведет себя целочисленное деление?
- Что означает дополнительный 0 перед значением типа int?(восьмеричные константы)
Арифметика с плавающей точкой
- Почему числа с плавающей запятой неточны?
- Программа на C для преобразования Фаренгейта в Цельсия (проблема целочисленного деления)
- Определено ли в стандарте C поведение приведения отрицательного числа типа double к unsigned int? Различное поведение на ARM и x86
Операторы, приоритет и порядок оценки
- Почему эти конструкции используют неопределенное поведение до и после инкремента?
- C: В чем разница между ++ i и i++?
- Обязательны ли закорачивающие логические операторы? А порядок оценки?
- Почему с массивами a[5] == 5[a]?
- Как установить, сбросить и переключить один бит?
- Что такое операторы побитового сдвига (побитового сдвига) и как они работают?
- Что делает оператор запятой?
- Почему не работает a+++++b?("правило максимального пережевывания")
- Постинкремент разыменованного указателя?(
*ptr++
вопросы приоритета) - Объединение в цепочку нескольких операторов больше / меньше (часто задаваемые вопросы, где новички предполагают, что "интервальный синтаксис"
0 < x < 10
действительно C)
Петли
- Почему порядок циклов влияет на производительность при итерации по 2D-массиву?
- Обратный отсчет быстрее, чем подсчет?
Массивы
- Что такое распад массива на указатель?
- Является ли имя массива указателем?
- Почему размер параметра массива не такой же, как у основного?
- Насколько опасно выходить за пределы массива?
- Получение исключения переполнения стека при объявлении большого массива
Указатели и нуль
- Как правильно писать код C/C++, когда нулевой указатель не все биты равны нулю
- Как получить доступ к локальной переменной из другой функции с помощью указателей?
- Как найти sizeof (указатель, указывающий на массив)?
- Почему указатель int '++' увеличивается на 4, а не на 1?
- Указатель на уточнение указателя
- Сбой или "ошибка сегментации" при копировании / сканировании / чтении данных в неинициализированный указатель
- Проблемы с "указателем из целого числа / целым числом из указателя без приведения"
Указатели на функции
- Как работают указатели на функции в C?
- Приведение указателя функции к другому типу
- Почему определения указателя на функцию работают с любым количеством амперсандов "&" или звездочек "*"?
Струны
- Как следует использовать символьные массивы в качестве строк? Отсутствует FAQ по нулевому терминатору.
- Как правильно присвоить новое строковое значение?
- Как правильно сравнивать строки?
- В чем разница между char s[] и char *s?
- Почему я получаю ошибку сегментации при записи в строку, инициализированную с помощью "char *s", но не "char s[]"?
- Почему strlcpy и strlcat считаются небезопасными?
- Строковые литералы: куда они деваются?
- Как разбить строку на токены в C?(как использовать strtok)
Распределение динамической памяти
- Могу ли я использовать результат malloc?
- Доступ к динамической памяти работает только внутри функции
- Правильное размещение многомерных массивов
Структуры и союзы
- Почему sizeof для структуры не равен сумме sizeof каждого члена?
- Разделение структуры на частные и публичные разделы?(частная инкапсуляция с непрозрачным типом / непрозрачными указателями)
- Определения типов, структуры с тегами и без тегов, а также несовместимые типы указателей
- sizeof() структура с элементом массива нулевой длины
Препроцессор и макросы
- В чем разница между #include
и #include "filename"? - Зачем использовать в макросах явно бессмысленные операторы do-while и if-else?
- Стрингификация - как это работает?
- Создание собственного файла заголовка на C (для часто задаваемых вопросов о защите заголовка / включения)
Стандартное соответствие
- Что должен вернуть main() в C и C++?
- Где мне найти текущие стандартные документы C или C++?
- В чем разница между C, C99, ANSI C и GNU C?
Неопределенное, неопределенное и определяемое реализацией поведение
- Неопределенное, неопределенное и определяемое реализацией поведение
- Окончательный список общих причин ошибок сегментации
- Что такое ошибка шины?
Стандартная библиотека
- Каких функций из стандартной библиотеки нужно (следует) избегать?
- Как читать / анализировать ввод на C? FAQ
- scanf () оставляет символ новой строки в буфере
- Удаление завершающего символа новой строки из ввода fgets()
- Правильный спецификатор формата для печати указателя или адреса?
- Почему "while (! Feof (file))" всегда неверно?
- Почему функция gets настолько опасна, что ее не следует использовать?
- Использование fflush(stdin)
- Что произойдет, если "&" не будет вставлено в оператор scanf?
- srand() - зачем вызывать его только один раз?
Лучшие практики и проблемы стиля
- Почему звездочка стоит перед именем переменной, а не после типа?
- "static const" vs "#define" vs "enum"
- Указатели typedef - хорошая идея?
- Что означает тип, за которым следует _t (подчеркивание-t)?
Внешние ресурсы
- В FAQ comp.lang.c есть ответы на многие часто задаваемые вопросы C. Например, см . Правило по часовой стрелке / спирали для анализа объявлений C.
- C Reference предоставляет ссылку на язык C и стандартные библиотечные функции.
- Что каждый компьютерный ученый должен знать об арифметике с плавающей запятой, Дэвид Голдберг
- cdecl: C gibberish ↔ English, сайт, который переводит выражения C на читаемый английский.
Программа Hello World на C
#include <stdio.h>
int main(void)
{
printf("hello, world\n");
return 0;
}
Чат
Обсуди C с другими пользователями stackru
Онлайн-компиляторы
- Repl.it C компилятор
- Компилятор OnlineGDB C
- Компилятор Tutorialspoint C
- Godbolt - обозреватель / дизассемблер компилятора C