• 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); 
    
    • 1
    • 2
    • 3
    复数
    <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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    增加和修改了一些标准头文件。
    比如定义 bool 的 <stdbool.h>,
    定义一些标准长度的 int<inttypes.h>,
    定义复数的 <complex.h> 
    定义宽字符的 <wctype.h> 
    有点泛型味道的数学函数 <tgmath.h> 
    跟浮点数有关的 <fenv.h>< stdarg.h> 里多了一个 va_copy 可以复制 ... 的参数。
    <time.h> 里多了个 struct tmxstruct tm 做了扩展.
    输入输出对宽字符还有长整数等做了相应的支持.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    复合字面量(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};
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    变长数组(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};
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    int *restrict ptr;
    restrict 是一个类型限定符,主要用于指针。
    当一个指针被声明为 restrict,它告诉编译器该指针是访问数据对象的唯一以及最初的方式。
    这意味着,如果一个对象通过一个 restrict 指针被访问,那么在该对象的生命周期内,所有其他指针都不会访问这个对象。
    这给了编译器优化的机会,因为它知道没有别的指针会同时修改数据。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    __int8 __int16 __int32 __int64 __int128
    size_t ptrdiff_t ==__int64 
    
    • 1
    • 2
    inline 建议编译器内联一个函数,即将函数的内容直接插入到每个调用点,以减少函数调用的开销。
    它不是一个强制性的指令,而只是一个建议。编译器可以选择忽略这个建议。
    示例: inline int add(int a, int b) { return a + b; }
    
    • 1
    • 2
    • 3

    以下为杂项:

    “替代记号”(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)。
    尾随逗号加不加都行,这个方便宏展开。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
  • 相关阅读:
    全国程序员高考卷曝光,你能答对几题?
    策略梯度方法介绍——确定性策略梯度定理
    【Mysql】内外连接
    栈和堆什么意思,Rust所有权机制又是什么
    PRCV 2023 - Day3
    软件测试秋招技术面试(面经)
    全栈开发 - 从 Vue 配置中解决 CORS 跨域问题(2分钟搞定)
    【MMC/SD/SDIO】概述
    荧光素醋酸,CAS号: 96087-38-6
    【华为OD机试python】数据分类【2023 B卷|100分】
  • 原文地址:https://blog.csdn.net/weixin_43172531/article/details/132892494