C语言复合字面量的使用
来源:互联网 发布:java会员管理系统源码 编辑:程序博客网 时间:2024/04/28 20:16
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
- C语言复合字面量的使用
- 关于复合字面量的使用问题
- 字面量(literal)与 C 语言复合字面量(compound literals)
- Objective-c中使用字面量语法
- C/C++字符串字面量的类型
- objective-c 2.0的字面量Literals
- @字面量语法的使用及优点
- 字面量语法的使用--IOS
- 字面量语法的使用--IOS
- swift中字面量的定义使用
- js对象字面量的使用
- javascript的字面量
- javascript的字面量
- javascript的字面量
- 字面量的概念
- IOS:Objective-C字面量
- IOS:Objective-C字面量
- IOS:Objective-C字面量
- MyBatis根据Map中key作为字段名,value作为字段值修改数据
- MySQL事务的艺术和陷阱
- linux 下密码加密程序(可以用于替换shadow文件中的用户密码)
- OAuth 2.0系列教程(八) 授权码授权
- [日志处理工作之六]kafka的分区策略 and 构建flume或logstash的采集与解析agent集群
- C语言复合字面量的使用
- Spring Mongodb
- 字符串的排列组合
- Freemark页面字符串显示截取 超过100显示...
- CNN卷积神经网络
- OAuth 2.0系列教程(九) 契约请求和响应
- 连续字数组的最大和
- 在MYSQL中插入当前时间,就象SQLSERVER的GETDATE()一样
- Android之Animation