C语言基础语法复习04-c99新特性详解

C89、C99、C11(2011年)、C17(2018年)
C89(也称为C90)是C语言的最早版本的标准,于1989年发布。
C99标准于1999年发布,引入了一些新特性,如变长数组、复合字面量、单行注释等。

可变参数宏(Variadic Macro)
#define MY_DEBUG_LOG(...) (printf(__VA_ARGS__)) 
MY_DEBUG_LOG("Hello, world! The value is:%d\n", 100); 
复数
<complex.h>头文件中定义了complex和imaginary宏,并将它们扩展为_Complex_Imaginary
float_Complex f = -1.0f; 
f = csqrtf( f ) + 1.0iF; 
printf("Thecomplexnumberis:%g+i %g\n", crealf(f), cimagf(f) ); 
_Complex 用于声明复数类型的变量。double _Complex z;
_Imaginary 用于声明纯虚数类型的变量。double _Imaginary img;
增加和修改了一些标准头文件。
比如定义 bool 的 <stdbool.h>,
定义一些标准长度的 int<inttypes.h>,
定义复数的 <complex.h> 
定义宽字符的 <wctype.h> 
有点泛型味道的数学函数 <tgmath.h> 
跟浮点数有关的 <fenv.h>< stdarg.h> 里多了一个 va_copy 可以复制 ... 的参数。
<time.h> 里多了个 struct tmxstruct tm 做了扩展.
输入输出对宽字符还有长整数等做了相应的支持.
复合字面量(Compound Literals)。
当一个类似结构的东西需要临时构造的时候,可以用 (type) { initializer-list }这有点像 C++ 的 构造函数。
typedef struct {int x, y;} Point;
Point p = (Point){.x=1, .y=2};
printPoint((Point){3, 4}); 
int *arr = (int[5]){1, 2, 3, 4, 5};
变长数组(Variable Length Arrays,简称 VLA)。
允许数组的长度在运行时决定,而不是在编译时。
int n;
printf("Enter the size of the array: ");
scanf("%d", &n);    
int arr[n]; // 使用变长数组定义数组
int matrix[m][n]; //多维也可以
VLA 在 C11 标准中被标记为可选功能

柔性数组:int a[] = {1,2};
int *restrict ptr;
restrict 是一个类型限定符,主要用于指针。
当一个指针被声明为 restrict,它告诉编译器该指针是访问数据对象的唯一以及最初的方式。
这意味着,如果一个对象通过一个 restrict 指针被访问,那么在该对象的生命周期内,所有其他指针都不会访问这个对象。
这给了编译器优化的机会,因为它知道没有别的指针会同时修改数据。
__int8 __int16 __int32 __int64 __int128
size_t ptrdiff_t ==__int64 
inline 建议编译器内联一个函数,即将函数的内容直接插入到每个调用点,以减少函数调用的开销。
它不是一个强制性的指令,而只是一个建议。编译器可以选择忽略这个建议。
示例: inline int add(int a, int b) { return a + b; }

以下为杂项:

“替代记号”(alternate tokens),某些历史环境和特定的系统提供了支持。
变量声明不必放在语句块的开头。
for 语句提倡这么写 for(int i=0;i<100;++i) 
取消了不写函数返回类型默认就是 int 的规定。
允许 struct 定义的最后一个 数组写做 [] 不指定其长度描述。
const const int i; 将被当作 const int i; 处理。
修改了求余 % 处理负数时的定义。
对于非常量的 表达式,也允许编译器做化简。
增加了 __func__ 当前函数的函数名 。
浮点数的内部数据描述支持了新标准,这个可以用 #pragma  编译器指定。
C和C++标准都识别#pragma这个关键字,但每个编译器可以提供自己特定的 #pragma。
printf和 scanf 的格式化串增加了支持 "%lld""%llu",对应long long int类型和unsigned long long int类型(可以分别简写为long longunsigned long long)。
支持 16 进制的浮点数的描述。
字符串里面,\u 支持  unicode 的字符。
新增了一种结构体/数组的初始化方式,名叫designated initializers,即:struct { int a[3], b; } w[] ={ [0].a = {1}, [1].a[0] = 2 };
_Bool 只有两个值:0 ()1 ()。
源程序每行要求至少支持到 4095  字节。
变量名与函数名的要求支持到 63 字节 (extern 要求支持到 31)。
尾随逗号加不加都行,这个方便宏展开。

你可能感兴趣的:(cpp,c语言,c++,开发语言)