• C语言复合字面量的使用


    C99添加的特性,复合字面量(composite literal)。一旦熟悉并使用,便会体会到简洁强大的表达。

    所谓字面量就是固定数值的表示。数值和字符串类型都有字面量的表达。如:

    // 100, 1.23f, "literral" 都是字面量
    int    x = 100;
    float  y = 1.23f;
    char* s = "literral";

    可看到字面构建的同一时候就能够复制给变量使用。既然是固定数值,那么在初始化的时候就能够构建。



    那么复合字面量是几个意思的复合?

    composite 除了有复合的意思。也有组合的概念。

    既然组合。必定数组是直观的相应。


    所以。复合字面量就是数组字面量的意思。

    以前。我们是怎样定义数组的。

    int arr1[]   = {0, 1, 2, 3};
    int arr2[10] = {0};

    这是最简单的数组。{ } 也是一种字面量的定义。然而。这样的字面量仅仅能在数组初始化的时候来使用,并不能赋值操作。

    int x;
    // 正确
    x = 100;
    
    int arr[1];
    // 错误
    arr = {0};


    对。 复合字面量,就是能够随时定义,随时赋值的数组字面量。两步构建出来。

    1.  形如 (type[]) 表示须要构建的数组类型,如: (int[]), (int*p), 还能是自己定义的类型 (MyType[])

    2.  跟着 { } 表示数组内容

    int*  intArr1 = (int[]) {0, 1, 2};
    int*  intArr2 = (int[100]) {0};
    
    intArr1  = (int[])  {3, 4, 5};
    intArr2  = (int[1]) {1};
    
    typedef struct {
        void* data;   
        int     length;
    } Array;
    
    Array*  arr1 = (Array[])  {NULL, 0};
    Array*  arr2 = (Array[1]) {(int[]) {1}, 1};

    可见。复合字面量,返回的是一个指针,指向了构建的数组字面量。

    可以随时定义出一个,数组的字面量指针。可以让參数传递。初始化结构。更加的简洁。



    举个样例:

    typedef struct {
    	void* data;
    	int   length;
    } Array;
    
    
    void foo(Array* arr) { }
    
    
    // 以前的写法
    int   data[]  = { 1 };
    Array arr [1] = {data, 1};
    foo(arr);
    
    
    // 如今的写法
    foo((Array[]) { (int[]) { 1 }, 1 });

    表达更为简洁。 也省去了非常多的赋值操作。非常多时候,构建字面量的数组不过为了一次函数调用的參数传递而已。



    static Array* arr = (Array[]) {
    	(int[10]) {0},
    	1
    };
    这个样例说明了。初始化一个结构时候的使用方法。

    不论什么一个复杂的自己定义类型。我们都可以通过复合文字定义出初始化的字面数值。

    这在构建一些须要初始化的固定数据结构非常实用处。



    还有。 复合文字能够做左值。

    不管字面数值创建在栈上还是在堆上,都能够被赋值。

    这就厉害了,能够发挥想象,有很多其它的黑魔法有待发掘。




  • 相关阅读:
    编辑器1.0
    react native定报预披项目知识点总结
    placeholder中文字添加换行方法
    ios端position为fixed失效的解决办法
    利用fis3构建前端项目工程
    webpack学习记录
    webpack学习记录-认识loader(二)
    webpack学习记录-初步体验(一)
    去抖(节流)
    css布局:左边定宽、右边自适应
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5114443.html
Copyright © 2020-2023  润新知