Учил С по K&R, но прочитал Бена Клеменса (Ben Klemens. 21st Century C: C Tips from the New School, O'Reilly Media, 2012, 296 p.) и вдохновился на использование "новинок".
Аннотация: сделано как в C++. При этом сохранена компактность языка и его нацеленность на быстродействие.
-
Не обязательно возвращать целое значение в функции
main()
.return 0;
генерируется автоматически. -
Возможность объявления переменных внутри блоков и вблизи от места использования, т. е.
Вместо
#include <stdio.h>
int main()
{
int i;
double ratio, denom = 7;
...
for (i=1; i<= 6; i++) {
ratio = i/denom;
printf("%g\n", ratio);
}
}
можно использовать
#include <stdio.h>
int main()
{
...
double denom = 7;
for (int i=1; i<= 6; i++) {
double ratio = i/denom;
printf("%g\n", ratio);
}
}
Причем то, что переменная ratio
объявляется внутри цикла, не означает, что на каждом шаге под нее заново выделяется память, и работа программы не замедляется.
-
Однострочные комментарии, начинающиеся с
//
. -
Новые типы данных, в частности:
-
long long int
-- расширенный целый тип (а тоlong int
зачастую равен все тем же 4-м байтам); - явный логический тип;
-
тип
complex
для представления комплексных чисел. -
Определение размера массива во время выполнения.
int maxnum = 10;
int data[maxnum];
теперь работает, равно как и
#include <stdlib.h>
int main(int argc, char* argv[])
{
int maxnum = atoi(argv[1]);
int data[maxnum];
}
- Меньше явных приведений типов. Раньше
malloc()
возвращалchar*
, теперь он возвращаетvoid*
, который компилятор автоматически приводит к нужному типу. Поэтому вместо
double *list = (double *) malloc(10*sizeof(double));
можно записать
double *list = malloc(10*sizeof(double));
- Инициализация отдельных полей структур:
struct color
{
int R;
int G;
int B;
};
struct color blue = { .B = 255 };
Пропущенные будут заполнены нулями. Структуры можно создавать в аргументах функций и возвращать из функций
struct color
{
int R;
int G;
int B;
};
void print_color_info(struct color *c)
{
printf("%i %i %i\n", c->R, c->G, c->B);
}
int main()
{
print_color_info(&(struct color){ .G = 122 });
}
Как использовать
Указать в опциях компилятора:
-std=c99
Ложка дегтя
К сожалению, не все производители компиляторов, и среди них Microsoft, поддержали C99. Поэтому, если вы используете компилятор этой фирмы, то вопрос о поддерживаемых ею стандартах необходимо изучить дополнительно. Однако указанные новинки прошли испытание временем и включены в следующий стандарт -- C11, так что, как ни крути, производители подтянутся.
Комментарии
comments powered by Disqus