C
- Русское название:
- Cи
- Дата создания:
- 1969-1973
- Создан под влиянием:
- Повлиял на:
- Парадигма:
- Типизация:
- Принятые расширения файлов:
- .c, .h
- Диалекты:
- Реализации и версии (свернуть все | развернуть все):
C — стандартизированный процедурный язык программирования.
Язык C был разработан в начале 1970-х годов сотрудниками Bell Labs Кеном Томпсоном и Денисом Ритчи как наследник языка B.
C был создан для использования в операционной системе UNIX, в том числе и для написания ядра системы. С тех пор он был портирован на многие другие операционные системы и стал одним из самых широко используемых языков программирования.
В 1978 году была опубликована книга “Язык программирования C” Ритчи и Кернигана; описанный в ней язык стал неформальным стандартом языка, известным как K&R C.
Первый официальный стандарт языка был создан в 1989 году ANSI X3.159-1989 и в следующем году с незначительными изменениями принят как ISO/IEC 9899:1990; он известен как ANSI C. Следующими стандартами стали ISO 9899:1999 (C99) и ISO/IEC 9899:2011 (C11).
C ценят за его эффективность; он является самым популярным языком для создания системного программного обеспечения. Его также часто используют для создания прикладных программ.
Особенности языка:
- минимальное количество ключевых слов.
- большинство возможностей языка вынесено в библиотеки.
- использование препроцессора для определения макросов, включения исходных кодов других файлов и условной компиляции.
- статическая слабая типизация: у всех данных есть фиксированные типы, но неявные преобразования разрешены.
- разрешено определение пользовательских типов и составных типов.
- предоставляется низкоуровневый доступ к памяти (через преобразование машинных адресов в типизированные указатели).
-
процедуры являются частным случаем функции, возвращающей специальный тип
void
. -
файлы можно компилировать отдельно и линковать друг с другом, контролируя видимость функций и данных ключевыми словами
static
иextern
.
Элементы синтаксиса:
Комментарий до конца строки | нет |
---|---|
Комментарии, которые могут быть вложенными | #if 0 ... #endif |
Комментарии, которые не могут быть вложенными | /* ... */ |
Регистрозависимость | да |
Регулярное выражение идентификатора переменной | [_a-zA-Z][_a-zA-Z0-9]* |
Присваивание значения переменной | <varname> = <value> |
Объявление переменной | <vartype> <varname> |
Группировка выражений | ( ... ) |
Блок | { ... } |
Равенство | == |
Неравенство | != |
Сравнение | < > <= >=, для строк strcmp |
Определение функции | returntype f(type1 p1, type2 p2, ...) |
Вызов функции | f(a, b, ...) |
Вызов функции без параметров | f() |
Последовательность | ; |
Если - то | if (condition) ... |
Если - то - иначе | if (condition) ... else ... |
Цикл с предусловием | while (condition) ... |
Цикл с постусловием | do ... while (!condition) |
Цикл for - next для диапазона целых чисел с инкрементом на 1 | for (int i = 1; i <= 10; i++) ... |
Цикл for - next для диапазона целых чисел с декрементом на 1 | for (int i = 10; i >= 1; i--) ... |
Ссылки:
Примеры:
Факториал:
Пример для версий GCC 3, GCC 4, TCC 0.9.25, gcc 3.4.5, gcc 3.4.5 (Objective-C)Используется рекурсивное определение факториала.
#include <stdio.h>
unsigned long long factorial(unsigned long long n)
{
if (n == 0) {
return 1;
} else {
return n * factorial(n - 1);
}
}
int main(void)
{
int n;
for (n = 0; n <= 16; n++) {
printf("%i! = %lld\n", n, factorial(n));
}
return 0;
}
Факториал:
Пример для версий MinGWИспользуется рекурсивное определение факториала.
#include <stdio.h>
unsigned long long factorial(unsigned long long n)
{
if (n == 0) {
return 1;
} else {
return n * factorial (n - 1);
}
}
int main(void)
{
int n;
for (n = 0; n <= 16; n++) {
printf("%i! = %I64u\n", n, factorial(n));
}
return 0;
}
Hello, World!:
Пример для версий Borland C++ Builder 6, TCC 0.9.25, g++ 3.4.5, gcc 3.4.5, gcc 3.4.5 (Objective-C)#include <stdio.h>
int main()
{
printf("Hello, World!\n");
return 0;
}
Числа Фибоначчи:
Пример для версий TCC 0.9.25, gcc 3.4.5, gcc 3.4.5 (Objective-C)Используется рекурсивное определение чисел Фибоначчи.
#include <stdio.h>
int fibonacci(int n)
{
return ( n<=2 ? 1 : fibonacci(n-1) + fibonacci(n-2) );
}
int main(void)
{
int n;
for (n=1; n<=16; n++)
printf("%d, ", fibonacci(n));
printf("...\n");
return 0;
}
CamelCase:
Пример для версий TCC 0.9.25, gcc 3.4.5, gcc 3.4.5 (Objective-C)Пример основан на посимвольной обработке строки. Функция gets
читает строку до конца строки. Следует отметить, что эта функция считается “опасной” из-за отсутствия контроля того, сколько символов введено, и возможных ошибках доступа к памяти. В C нет логического типа данных, поэтому его приходится симулировать целой переменной.
#include <stdio.h>
void main() {
char text[100],cc[100];
gets(text);
int i,j=0,lastSpace=1;
for (i=0; text[i]!='\0'; i++)
if (text[i]>='A' && text[i]<='Z' || text[i]>='a' && text[i]<='z')
{ if (lastSpace>0)
cc[j] = toupper(text[i]);
else
cc[j] = tolower(text[i]);
j++;
lastSpace = 0;
}
else
lastSpace = 1;
cc[j]='\0';
printf("%s\n",cc);
}
Квадратное уравнение:
Пример для версий Borland C++ Builder 6, Microsoft Visual C++ 9 (2008), TCC 0.9.25, g++ 3.4.5, gcc 3.4.5, gcc 3.4.5 (Objective-C)Этот пример работает на C и C++, а также на Objective-C, являющемся строгим надмножеством языка C. В случае C может понадобиться компилировать программу с опцией -lm
, чтобы подключить библиотеку математики.
#include <math.h>
#include <stdio.h>
int main()
{
int A, B, C, D;
printf("A = ");
scanf("%d", &A);
if (A == 0) {
printf("Not a quadratic equation.\n");
return 0;
}
printf("B = ");
scanf("%d", &B);
printf("C = ");
scanf("%d", &C);
D = B * B - 4 * A * C;
if (D == 0) {
printf("x = %f\n", -B / 2.0 / A);
return 0;
}
if (D > 0) {
printf("x1 = %f\nx2 = %f\n",
(-B + sqrt(D)) / 2.0 / A, (-B - sqrt(D))/ 2.0 / A);
} else {
printf("x1 = (%f, %f)\nx2 = (%f, %f)\n",
-B / 2.0 / A, sqrt(-D) / 2.0 / A, -B / 2.0 / A, -sqrt(-D) / 2.0 /A);
}
return 0;
}
Квадратное уравнение:
Пример для версий gcc 4.4.3Этот пример использует тип данных complex
, впервые появившийся в C99, и функции для работы с ним.
#include <stdio.h>
#include <complex.h>
#include <math.h>
void print(int ind, double complex x) {
printf("x%d = ", ind);
if (fabs(cimag(x)) < 1e-6)
printf("%f\n", creal(x));
else printf("(%f, %f)\n", creal(x), cimag(x));
}
int main() {
double A, B, C;
double D;
printf("A = ");
scanf("%lf", &A);
if (fabs(A)<1E-3) {
printf("Not a quadratic equation\n");
return 1;
}
printf("B = ");
scanf("%lf", &B);
printf("C = ");
scanf("%lf", &C);
A *= 2;
D = B*B-A*C*2.0;
if (fabs(D)<1E-3)
printf("x = %f", creal(-B/A));
else {
print(1, (-B+csqrt(D))/A);
print(2, (-B-csqrt(D))/A);
}
return 0;
}
Hello, World!:
Пример для версий GCC 4, gcc 4.4.3X11,чистый Xlib. Компилируется : gcc test.c -o test -lX11
Программа создает с помощью функции XOpenDisplay соединение с X-Server. Функция DefaultScreen выбирает текущий экран, XCreateSimpleWindow создает окно, а XSelectInput определяет события, на которые окно должно реагировать. XMapWindow выводит окно на экран, а XNextEvent выбирает из очереди событие, которое выше было определено. При событии Expose в окне выводится “Hello World!”. При нажатии клавиши на клавиатуре программа завершает работу.
#include <X11/Xlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
extern int errno;
int main(void) {
Display *display;
Window window;
XEvent e;
char *msg = "Hello, World!";
int s;
/* Соединиться с X сервером */
if ((display = XOpenDisplay(getenv("DISPLAY"))) == NULL)
{
printf("Can't connect X server: %s\n", strerror(errno));
exit(1);
}
s = DefaultScreen(display);
/* Создать окно */
window = XCreateSimpleWindow(display, RootWindow(display, s), 10, 10, 200, 100, 1, BlackPixel(display, s), WhitePixel(display, s));
/* На какие события будем реагировать */
XSelectInput(display, window ,ExposureMask | KeyPressMask);
XMapWindow(display, window); /* Вывести окно на экран */
/* Бесконечный цикл обработки событий */
while (1)
{
XNextEvent(display, &e);
/* Перерисовать окно */
if (e.type == Expose)
{
XDrawString(display, window, DefaultGC(display, s), 50, 50, msg, strlen(msg)); /*Вывод текста*/
}
if (e.type == KeyPress)
break;
}
XCloseDisplay(display); /* Закрыть соединение с X сервером */
return 0;
}
Комментарии
]]>blog comments powered by Disqus
]]>