C99是1999年采用的C的ISO / IEC 9899:1999标准规范的另一个名称。本文主要通过与C89标准进行比较,重点介绍C99中添加的新功能。在C99标准的开发阶段,重新检查了C语言的每个元素,分析了使用模式,并预期了未来的需求。 C与C++的关系为整个开发过程提供了背景。最终的C99标准证明了原始标准的优势。
- 在C99中添加的关键字:
- 内联: C99添加适用于函数的关键字内联。如果我们写内嵌数据类型函数名(PARAM)任何函数就意味着我们指定编译器优化调用该函数,即函数的代码将被内联,而不是所谓的扩大。
例子:
// C program to demonstrate inline keyword #include
inline int maximum(int a, int b) { return a > b ? a : b; } int main() { int x = 5, y = 10; printf("Maximum of %d and %d is %d", x, y, maximum(x, y)); return 0; } 注意:某些编译器显示对maximum()的未定义引用。此内联功能很少用作关键字。
上面的程序等效于以下程序
#include
int main() { int x = 5, y = 10; printf("Maximum of %d and %d is %d", x, y, (x > y ? x : y)); return 0; } 输出:Maximum of 5 and 10 is 10
输出:Maximum of 5 and 10 is 10
内联函数通过维护结构化,基于函数的方法来帮助我们创建有效的代码。
- 限制:限制是仅适用于指针的类型限定符。最初,通过限制限定的指针是可以访问其指向的对象的唯一方法。仅当第二个指针基于第一个指针时,才可能发生另一个指针对对象的访问。
我们使用限制限定符来限制对对象的访问。这些主要用作函数参数或在malloc()中。限制限定符从不更改程序的语义。
- _Bool数据类型: _Bool数据类型是在C99标准中添加的,该标准存储0和1值。 _Bool是整数类型。
注意: C++中的bool关键字和C中的_Bool是不同的。
_Bool很少使用,取而代之的是C99定义了一个新的头文件stdbool.h ,该文件定义了三个布尔值,即true和false。
- _Complex: C99添加了对通过_Complex和_Imaginary关键字对复数执行运算的支持。这些关键字为数字编程提供了更好的支持。
_Complex中定义的类型:
- 浮点数_Complex
- 双_Complex
- 长双_Complex
- _Imaginary:如上所述,C99添加了对通过_Complex和_Imaginary关键字对复数执行运算的支持。这些关键字为数字编程提供了更好的支持。
_Complex和_Imaginary中定义的类型:
- 浮点数_Imaginary
- 双_虚构
- 长双_Imaginary
就像在_Bool数据类型中讨论的一样,这些_Complex和_Imaginary并不经常使用。相反,我们使用头文件它由内置宏,复杂宏和虚构宏组成。
- 内联: C99添加适用于函数的关键字内联。如果我们写内嵌数据类型函数名(PARAM)任何函数就意味着我们指定编译器优化调用该函数,即函数的代码将被内联,而不是所谓的扩大。
- 类型修饰符的添加: C99中添加的另一个重要方面是引入long long和无符号long long类型修饰符。 long long int的范围是–(2 ^ 63 – 1)到+(2 ^ 63 –1)。 Unsigned long long int的最小范围是从0到+(2 ^ 64 –1)。这种long long类型允许64位整数作为内置类型支持。
- 数组的更改: C99向数组添加了两个重要功能:
- 可变长度数组:在C89标准中,必须在数组声明时使用整数常量来指定数组大小,并且数组大小在编译时是固定的。在C99标准中,我们可以声明一个数组,其尺寸由运行时已知其值的任何整数表达式指定。这称为可变长度数组(VLA) 。
- 包含类型限定符:在C99中,我们可以在数组声明期间在方括号内使用关键字static 。仅当在函数参数中声明数组时才应用此函数,即
例子:
int fun1(char arr[static 80]) { // code }
在上面的示例中,arr始终是指向80个元素的数组的指针,即arr确保指向包含至少80个元素的char数组的起始元素。如果在函数参数中声明了该数组,我们也可以在方括号内使用关键字strict,volatile和const。关键字restrict指定指针是访问对象的唯一初始方式。 const指出指针始终指向同一对象。允许使用volatile ,但没有意义。
例子:
#include
void fun(int a[static 10]) { for (int i = 0; i < 10; i++) { a[i] += 1; printf("%d ", a[i]); } } int main() { int a[] = { 1, 2, 3, 4, 4, 4, 4, 4, 5, 5, 6, 7, 8, 9, 10 }; fun(a); } 输出:2 3 4 5 5 5 5 5 6 6
- 单行注释: C89标准不接受单行注释。 C99标准引入了单行注释,仅在需要简短说明时使用。这些注释以//开头,并运行到该行的末尾。
例如:
// First Comment int a; // another comment
- 标识符声明:
根据C89标准,所有标识符都应在代码块的开头声明。如果中间需要其他标识符,则无法为该实例或时间声明。我们需要在开始时声明这一点。 C99更改了此规则,因为我们可以随时在代码中声明标识符。简单来说,我们可以将其视为:
#include
int main() { int i; i = 1; int j; // this declaration is invalid in C89 standard, but valid in C99 and C++ j = 3; } 输出: