]]> ]]>

C99

Диалект языка программирования C

После принятия стандарта ANSI C спецификация языка C не менялась в течение долгого времени (в 1995 году в стандарт C была внесена Первая Нормативная Поправка, но её почти никто не признавал). В конце 1990-х годов стандарт наконец подвергся пересмотру, и был опубликован как ISO 9899:1999 в 1999 году. Этот стандарт обычно называют «C99». В марте 2000 года он был принят и ANSI.

Этот стандарт ввел:

  • комментарии до конца строки //...
  • встраиваемые функции (inline)
  • объявлять переменные можно в произвольном месте, а не только в начале блока
  • новые типы данных: long long int, extended, _Bool, complex
  • массивы переменной длины
  • новые библиотечные функции и заголовочные файлы
  • математические функции, не зависящие от типа (tgmath.h)
  • поддержка ограниченных указателей (restrict), позволяющая оптимизировать код
  • составные литералы для инициализации структур
  • улучшенная поддержка стандарта IEEE чисел с плавающей точкой
  • макросы с переменным числом аргументов

Большинство реализаций C поддерживают этот стандарт в той или иной мере, но производители некоторых компиляторов предпочли не добавлять его в свои продукты, а сосредоточиться на других, например, на компиляторах C++.

Для написания кода, использующего элементы, отличающиеся в C99 и в более ранних стандартах, можно использовать макрос __STDC_VERSION__ (значение 199901L).

Примеры:

Квадратное уравнение:

Пример для версий 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;
}
 

Комментарии

]]>

blog comments powered by Disqus

]]>

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