C语言标准的发展

C语言的发展历史大致上分为4个阶段:Old Style C、C89、C99和C11.

C89是最早的C语言规范,于1989年提出,1990年先由ANSI(美国国家标准委员会,American National Standards Institute)推出ANSI版本,后来被接纳为ISO国际标准(ISO/IEC9899:1990),因而有时也称为C90,最经典的C语言教材[K&R]就是基于这个版本的,C89是目前最广泛采用的C语言标准,大多数编译器都完全支持C89,C99(ISO/IEC9899:1999)是在1999年推出的,加入了许多新的特性,但目前仍没有得到广泛支持,在C99推出之后相当长的一段时间里,连gcc也没有完全实现C99的所有特性。2011年12月8号,ISO 发布了新的 C 语言的新标准——C11,之前被称为C1X,官方名称 ISO/IEC 9899:2011。

本文地址:http://www.cnblogs.com/archimedes/p/c99-new-feature.html,转载请注明源地址。

现在介绍一下C99相对于C89或者ANSI C的新特性:

1.复数(complex)

complex.h是C标准函数库中的头文件,提供了复数算术所需要的宏定义与函数声明。

#define complex  _Complex
#define _Complex_I  ((const float _Complex)__I__)
#define I  _Complex_I

C99规定了关键字_Complex。因而有3种复数类型:

  • double _Complex
  • float _Complex
  • long double _Complex

次序不是必须遵守的,比如float _Complex也可以写成_Complex float。_Complex_I扩展为类型为const float _Complex的常量值,其值为虚数单位。C99规定complex作为宏扩展为_Complex。但C++未定义complex宏。gcc仅支持complex type,不支持imaginary type。因此宏I扩展为_Complex_I

<complex.h>里面还包含了不少支持复数的数学函数(c打头的就是):

1、ccos,csin,ctan,cacos,casin,catan:复数域内的三角函数,有对应的f和l版本。

2、ccosh,csinh,ctanh,cacosh,casinh,catanh:复数域内的双曲函数,有对应的f和l版本。

3、cexp,clog,cabs,cpow,csqrt:复数域内的指数、对数、绝对值、幂函数,有对应的f和l版本。

4、carg,cimag,creal,conj,cproj:获取象限角、虚数部分、实数部分、a=x及b=-y、Riemann球上的投影,有对应的f和l版本。

代码:

#include<stdio.h>
#include<complex.h>
int main()  
{
    double complex cmp = 1.3 + 2.3*I;
    printf("%f + %fi\n", creal(cmp), cimag(cmp));
    return 0;  
}  

2.指定初始化(Designated Initializers)

在初始化结构体和数组时,可以通过指定具体成员名或数组下标来赋初值

要指定数组的索引对应的值,可以在相应的元素值前使用‘[index] =’,index必须是常量表达式例如:

int a[6] = { [4] = 29, [2] = 15 };

等价于:

 int a[6] = { 0, 0, 15, 0, 29, 0 };

还可以向下面这样初始化:

int a[10] = { [1] = 1, [8 ... 9] = 10 };

这样可以只初始化a[1], a[8], a[9]三个元素,其他元素的值为0,等价于:

int a[10] = {0, 1, 0, 0, 0, 0, 0, 0, 10, 10};

对于结构体,指定成员名初始化可以使用‘.fieldname=’,例如:

 struct point { int x, y; };

接下来初始化:

struct point p = { .y = yvalue, .x = xvalue };  // 等价于 struct point p = { xvalue, yvalue };

还可以使用冒号:

struct point p = { y: yvalue, x: xvalue };

当然也可以用在union中:

union foo { int i; double d; };
union foo f = { .d = 4 };

3.变长数组(Variable Length Arrays)

C99允许可以定义一个长度为变量的数组(这个数组的长度可以到运行时才决定)

FILE *
concat_fopen (char *s1, char *s2, char *mode)
{
       char str[strlen (s1) + strlen (s2) + 1];
       strcpy (str, s1);
       strcat (str, s2);
       return fopen (str, mode);
}

相关文章:

  • 2021-12-28
  • 2022-12-23
  • 2021-08-04
  • 2021-11-14
  • 2021-05-18
  • 2021-08-18
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-05-20
  • 2022-12-23
  • 2021-09-27
  • 2021-12-03
  • 2022-01-04
相关资源
相似解决方案