]]> ]]>
Править | Обсудить | История

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.3

X11,чистый 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

]]>

Работа программистам