c/c++语言开发共享C语言复合字面量的使用

c99增加的特性,复合字面量(composite literal)。一旦熟悉并使用,便会体会到简洁强大的表达。 所谓字面量就是固定数值的表示。数值和字符串类型都有字面量的表达。如:  

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  };

这个例子说明了,初始化一个结构时候的用法。任何一个复杂的自定义类型,我们都能够通过复合文字定义出初始化的字面数值。

 

这在构建一些需要初始化的固定数据结构很有用处。

 

 

还有, 复合文字可以做左值。无论字面数值创建在栈上还是在堆上,都可以被赋值。

这就厉害了,可以发挥想象,有更多的黑魔法有待发掘。

 

 

 

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/606546.html

(0)
上一篇 2021年5月14日
下一篇 2021年5月14日

精彩推荐