C99标准新特性的说明


一、说明

======

这里的讨论的是C语言的国际标准,即国际标准化组织ISO,制定的C语言标准。历史上ISO制定过4个版本的C语言标准,他们分别是:C90(ISO/IEC9899:1990)、C95(ISO/IEC 9899/AMD1:1995)、C99(ISO/IEC9899:1999)、C11(ISO/IEC 9899:2011)

这里主要介绍一下C99相对C90而增加的新特性,并且在Gcc编译器中对这些新特性的进行测试。

二、C99新特性介绍

=============

C99引入了很多个新特性,有些是非常常用的,已经在其他语言中大量普遍使用了,非常的方便,有些是不太常用的。下面逐个介绍。

2.1 混合代码和声明intermingled declarations and code

----------------------------------------------------------------

variable declaration is no longer restricted to file scope or the start of a compound statement (block)。

#include <stdio.h>

int main(int argc, char *argv[])
{
	int a1 = 10;
	printf("a1 = %d\n", a1);
	int a2 = 20;
	printf("a2 = %d\n", a2);

	return 0;
}

2.2 长度可变的数组variable-length arrays

-------------------------------------------------

数组在C语言中定义时,只能用常量表达式来指定其长度,可变长度的数组在定义时可以使用变量来指定数组的长度,这样以来,就可以定必须等到运行时才能知道大小的数组。

#include <stdbool.h>

int main(int argc, char *argv[])
{
	int size;
	scanf("%d", &size);
	int arr[size]; //使用运行时才能确定其值的变量作为数组长度来定义数组
	for (int i = 0; i < size; i++)
	{
		scanf("%d", &arr[i]);
	} 

	for (int i = 0; i < size; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");

	return 0;
}

2.3 支持单行注释one-line comments

------------------------------------------

support for one-line comments beginning with //, as in BCPLC++ and Java.

#include <stdio.h>

int main(int argc, char *argv[])
{
	//this a one line comment 

	return 0;
}

2.4 for语句内的变量声明

----------------------------  

C99中,可以在for语句的初始化部分定义一个或多个变量,这些变量的作用域仅于本for语句所控制的循环体内。

#include <stdio.h>

int main(int argc, char *argv[])
{
	int arr[5] = {1, 2, 3, 4, 5};
	for (int i = 0; i < sizeof(arr)/sizeof(arr[0]); i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");

	return 0;
}

2.5 内联函数inline functions

--------------------------------

#include <stdio.h>

inline int add(int a, int b)
{
	return (a + b);
}

int main(int argc, char *argv[])
{
	printf("%d + %d = %d\n", 10, 20, add(10, 20));

	return 0;
}

2.6 引入了新的数据类型,包括:long long int、_Bool、_Complex、_Imaginary

------------------------------------------------------------------------------------------

several new data types, including long long int, optional extended integer types, an explicit boolean data type, and a complex type to represent complex numbers

1 long long int   

C99标准中引进了long long int(-(2e63 - 1)至2e63 - 1)和unsigned long long int(0 - 2e64 - 1)。long long int能够支持的整数长度为64位。

2 _Bool

_Bool是作为关键字引入的。_Bool类型的变量的值是0或1。

C99中增加了头文件夹<stdbool.h>,在其中定义bool、true以及false宏的, 以便程序员能够编写同时兼容于C与C++的应用程序。在编写新的应用程序时,应该包含<stdbool.h>头文件,并且使用bool宏来定义_Bool类型的变量,通过用true和false这两个宏来为_Bool类型的变量赋值。

3 _Complex和_Imaginary

_Complex关键字用来代表复数类型,_Imaginary关键字用来代表虚数类型。

这两个关键字和float、double以及long double组合,可以形成如下的六种类型:

float _Complex

float _Imaginary

double _Complex

double _Imaginary

long double _Complex

long double _Imaginary

同时,C99新增了<complex.h>头文件,在其中定义了complex和imaginary宏,它们可以扩展为_Complex和_Imaginary。因此在编写新的应用程序时,应该在程序中包含<complex.h>头文件,并且使用中的complex和imaginary来定义复数变量和虚数变量。

_Imaginary关键字gcc暂时不支持。

#include <stdio.h>
#include <stdbool.h>
#include <complex.h>

int main(int argc, char *argv[])
{
	long long ll = 10;
	printf("ll = %d\n", ll);

	_Bool b1 = true;
	printf("b1 = %d\n", b1);
	bool b2 = true;
	printf("b2 = %d\n", b2);

	float complex fc = 1.0f + 2.0j;
	double complex dc = 3.0 + 4.0j;
	long double complex ldc = 5.0 + 6.0i;

	//下面的代码在gcc无法编译通过
	//float imaginary fi = 2.0j;
	//double imaginary di = 3.0j;
	//long double imaginary = 4.0i;

	return 0;
}

以上六个特性是非常常用,而且有用的特性。

2.7 其余待续

---------------

参考资料:

1、https://en.wikipedia.org/wiki/C99

2、http://www.cnblogs.com/fly1988happy/archive/2012/04/13/2445465.html

3、http://blog.csdn.net/syrchina/article/details/6662243

时间: 2024-10-09 08:12:52

C99标准新特性的说明的相关文章

C++11 标准新特性:Defaulted 和 Deleted 函数

前两天写的铁字中提到了C++的删除函数,今天特地去网上查了查,转载了一篇不错的文章... 转载自 http://www.ibm.com/developerworks/cn/aix/library/1212_lufang_c11new/index.html C++11 标准新特性:Defaulted 和 Deleted 函数 本文将介绍 C++11 标准的两个新特性:defaulted 和 deleted 函数.对于 defaulted 函数,编译器会为其自动生成默认的函数定义体,从而获得更高的代

C++11 标准新特性: 右值引用与转移语义

C++ 的新标准 C++11 已经发布一段时间了.本文介绍了新标准中的一个特性,右值引用和转移语义.这个特性能够使代码更加简洁高效. 查看本系列更多内容 | 3 评论: 李 胜利, 高级开发工程师, IBM 2013 年 7 月 10 日 内容 在 IBM Bluemix 云平台上开发并部署您的下一个应用. 开始您的试用 新特性的目的 右值引用 (Rvalue Referene) 是 C++ 新标准 (C++11, 11 代表 2011 年 ) 中引入的新特性 , 它实现了转移语义 (Move

C11标准新特性

C11标准是C语言标准的第三版(2011年由ISO/IEC发布),前一个标准版本是C99标准.相比C99,C11有哪些变化呢-- 1. 对齐处理 alignof(T)返回T的对齐方式,aligned_alloc()以指定字节和对齐方式分配内存,头文件<stdalign.h>定义了这些内容. 2. _Noreturn _Noreturn是个函数修饰符,位置在函数返回类型的前面,声明函数无返回值,有点类似于gcc的__attribute__((noreturn)),后者在声明语句尾部. 3. _G

html5标准新特性及其使用技巧

运用html5新特性,首先需要声明头文件,其实浏览器不认识头也会照最新标准渲染.声明后网站结构如下:1 <!DOCTYPE html> <html><head> <!--html lang="zh-cmn-Hans"--> <meta charset="UTF-8"> <!--<link rel="stylesheet"type="text/css"hre

【转】C++11 标准新特性:Defaulted 和 Deleted 函数

原文链接http://www.ibm.com/developerworks/cn/aix/library/1212_lufang_c11new/ 本文将介绍 C++11 标准的两个新特性:defaulted 和 deleted 函数.对于 defaulted 函数,编译器会为其自动生成默认的函数定义体,从而获得更高的代码执行效率,也可免除程序员手动定义该函数的工作量.对于 deleted 函数, 编译器会对其禁用,从而避免某些非法的函数调用或者类型转换,从而提高代码的安全性.本文将通过代码示例详

C99标准的新特性

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

C99新特性

c99标准允许使用变长数组,变的意思是可以根据变量的值来指定数组的维数,如根据用户的输入值指定数组的大小,印象中以前是不可以的.现在在gcc中是可以的(PS:ansi c标准是C90标准): ====================================================================== #include <stdio.h> #include <string.h> int    main(void) {     int n,i;     

C99新特性:Designated initializer

代码: #include <stdio.h> #include <stdlib.h> #define LENGTH 10 // C99新特性:Designated initializer void display(int arr[], size_t len); int main(void) { int a1[LENGTH] = { 0, 0, 5, 0, 6, 7 }; display(a1, LENGTH); int a2[LENGTH] = { [2] = 5, [4] = 6

C++ 11新特性解析——《深入理解C++ 11:C++11新特性解析和应用》读书笔记

因为偶然的机会,在图书馆看到<深入理解C++ 11:C++11新特性解析和应用>这本书,大致扫下,受益匪浅,就果断借出来,对于其中的部分内容进行详读并亲自编程测试相关代码,也就有了整理写出这篇读书笔记的基础.C++作为踏入编程的最初语言,一直充满感情,而C++11作为新标准虽然推出一段时间了,却因为总总原因直到现在才去开始真正了解,不过一句话回荡在脑中:当你认为为时已晚的时候,恰恰是最早的时候!从C++98到C++11, C++11标准经历了10几年的沉淀,以全新的姿态迎接新的挑战,长话短说,