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
]]>