C语言复合字面量的使用
2016-01-08 20:49
423 查看
C99添加的特性,复合字面量(composite literal)。一旦熟悉并使用,便会体会到简洁强大的表达。
所谓字面量就是固定数值的表示。数值和字符串类型都有字面量的表达。如:
可看到字面构建的同一时候就能够复制给变量使用。既然是固定数值,那么在初始化的时候就能够构建。
那么复合字面量是几个意思的复合?
composite 除了有复合的意思。也有组合的概念。
既然组合。必定数组是直观的相应。
所以。复合字面量就是数组字面量的意思。
以前。我们是怎样定义数组的。
这是最简单的数组。{ } 也是一种字面量的定义。然而。这样的字面量仅仅能在数组初始化的时候来使用,并不能赋值操作。
对。 复合字面量,就是能够随时定义,随时赋值的数组字面量。两步构建出来。
1. 形如 (type[]) 表示须要构建的数组类型,如: (int[]), (int*p), 还能是自己定义的类型 (MyType[])
2. 跟着 { } 表示数组内容
可见。复合字面量,返回的是一个指针,指向了构建的数组字面量。
可以随时定义出一个,数组的字面量指针。可以让參数传递。初始化结构。更加的简洁。
举个样例:
表达更为简洁。 也省去了非常多的赋值操作。非常多时候,构建字面量的数组不过为了一次函数调用的參数传递而已。
不论什么一个复杂的自己定义类型。我们都可以通过复合文字定义出初始化的字面数值。
这在构建一些须要初始化的固定数据结构非常实用处。
还有。 复合文字能够做左值。
不管字面数值创建在栈上还是在堆上,都能够被赋值。
这就厉害了,能够发挥想象,有很多其它的黑魔法有待发掘。
所谓字面量就是固定数值的表示。数值和字符串类型都有字面量的表达。如:
// 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 };这个样例说明了。初始化一个结构时候的使用方法。
不论什么一个复杂的自己定义类型。我们都可以通过复合文字定义出初始化的字面数值。
这在构建一些须要初始化的固定数据结构非常实用处。
还有。 复合文字能够做左值。
不管字面数值创建在栈上还是在堆上,都能够被赋值。
这就厉害了,能够发挥想象,有很多其它的黑魔法有待发掘。
相关文章推荐
- C++数据类型与C#对应关系
- C++校门外的树
- C++11的右值引用
- C语言实现全排列
- C++ string substr()
- 回文字符串切割问题
- C++开发人脸性别识别教程(7)——搭建MFC框架之界面绘制
- 将Vim改造为强大的IDE—Vim集成Ctags/Taglist/Cscope/OmniCppComplete
- Sicily 1286. Pascal Library
- iOS学习第三天,C语言的学习
- (IOS自学)C语言基础学习(二)
- C++:友元2(时间之差)
- C++ 类头文件的编译错误
- C++:友元1(两点之间的距离)
- C++:类与对象6(静态成员:平均分)
- iOS学习第二天,C语言知识学习
- 学习iOS第一天,iOS的简介,C语言的简介
- Sicily 1639. Run Length Encoding
- 【土狗之路】coursera上C语言基础第七周作业
- C语言实现一个最简单的队列