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
};
这个样例说明了。初始化一个结构时候的使用方法。
不论什么一个复杂的自己定义类型。我们都可以通过复合文字定义出初始化的字面数值。
这在构建一些须要初始化的固定数据结构非常实用处。
还有。 复合文字能够做左值。
不管字面数值创建在栈上还是在堆上,都能够被赋值。
这就厉害了,能够发挥想象,有很多其它的黑魔法有待发掘。
C语言复合字面量的使用的更多相关文章
- 字面量(literal)与 C 语言复合字面量(compound literals)
在计算机科学中,字面量(literal)是用于表达源代码中一个固定值的表示法(notation)(字面量是相对变量常量等定义的,无论是常量还是变量,其值在某一时刻总是确定的,只是变量可以反复赋值.刷新 ...
- (C99)复合字面量
#include <stdio.h> struct argvs { char a[64]; int b; }; int pfunc(struct argvs *a) { printf(&q ...
- 【Go入门教程2】基本构成元素:标识符(identifier)、关键字(keyword 25个)、字面量(literal)、分隔符(delimiter)、和 操作符(operator)
基本构成要素 Go 的语言符号 又称 词法元素,共包括 5 类内容——标识符(identifier).关键字(keyword).字面量(literal).分隔符(delimiter) 和 操作符(op ...
- C语言 字面量
在计算机科学中,字面量(literal)是用于表达源代码中一个固定值的表示法(notation). 几乎所有计算机编程语言都具有对基本值的字面量表示,诸如:整数.浮点数以及字符串: 而有很多也对布尔类 ...
- c语言中的字面量
在计算机科学中,字面量(literal)是用于表达源代码中一个固定值的表示法(notation). 几乎所有计算机编程语言都具有对基本值的字面量表示,诸如:整数.浮点数以及字符串: 而有很多也对布尔类 ...
- Swift语言指南(五)--数字字面量和数字类型转换
原文:Swift语言指南(五)--数字字面量和数字类型转换 数字字面量 整数字面量写法如下: · 十进制数,无前缀 · 二进制数,以 0b 为前缀 · 八进制数,以 0o 为前缀 · 十六进制数,以 ...
- Go语言中初始化变量中字面量&Type{}、new、make的区别
Go语言中new和make是内建的两个函数,主要用来创建分配类型内存.在我们定义生成变量的时候,可能会觉得有点迷惑,其实他们的规则很简单,下面我们就通过一些示例说明他们的区别和使用. 变量的声明 va ...
- (52)Wangdao.com第七天_字面量/变量_标识符_数据类型_数据的存储
JavaScript 字面量 和 变量 字面量:就是那些不可变的值,如1,2,100,2000,Infinity,NaN 变量: 变量,代表的当前随机分配的内存地址. 变量的值,是可变的,可以用来保存 ...
- java的数据类型、自动拆装箱、字面量
java 中的数据类型分为两大类:值类型(基本数据类型)和引用类型(复合数据类型) 值类型分为 1,整数类型(byte,short,int,long) 2,浮点类型(float,double) 3, ...
随机推荐
- Android 代码混淆
什么是代码混淆 Java 是一种跨平台的.解释型语言,Java 源代码编译成中间”字节码”存储于 class 文件中.由于跨平台的需要,Java 字节码中包括了很多源代码信息,如变量名.方法名,并且通 ...
- WCF技术剖析之十七:消息(Message)详解(中篇)
原文:WCF技术剖析之十七:消息(Message)详解(中篇) [爱心链接:拯救一个25岁身患急性白血病的女孩[内有苏州电视台经济频道<天天山海经>为此录制的节目视频(苏州话)]]在上篇中 ...
- 免插件打造wordpress投稿页面
一.新建投稿页面模板 把主题的 page.php 另存为 tougao.php,并且在第一行的 <?php 之后添加模板的标识注释: /* Template Name: tougao */ 紧接 ...
- Ubuntu下使用sshfs挂载远程目录到本地(和Windows挂载盘一样)
访问局域网中其他Ubuntu机器,在不同机器间跳来跳去,很是麻烦,如果能够把远程目录映射到本地无疑会大大方面使用,就像Windows下的网络映射盘一样.在Linux的世界无疑也会有这种机制和方式,最近 ...
- Andorid Binder进程间通信---总结
一.Server和Service Manager进程间通信 Service Manager进程启动时,已经创建了Service Manager实体对象,没有Service Manager本地对象. S ...
- 实现StatusBar的Flat风格
效果见右图,OfficeXP里就是这样的风格,其实实现很简单,不必专门在网上找别人控件. 把StatusBar的SimplePanel设为False,点击Panels添加StatusPanel,把所有 ...
- 终于懂了:TWinControl.DefaultHandler里的CallWindowProc(FDefWndProc)还挺有深意的,TButton对WM_PAINT消息的处理就是靠它来处理的(以前不明白为什么总是要调用inherited,其实就是没有明白TWinControl.DefaultHandler的真正用处)
我忽然发现:TButton既没有处理WM_PAINT,又没有Paint()或者PaintWindow(),那么它是什么时候被绘制的? Form1上放2个TButton,然后设置代码: procedur ...
- hdu 4687 Boke and Tsukkomi
Dancing link twice. Find the maximum combination numbers in the first time. Enumerate each node, dan ...
- c/c++ 动态申请数组
new和delete运算符用于动态分配和撤销内存的运算符 new使用方法: 1. 开辟单变量地址空间 1)new int; //开辟一个存放数组的存储空间,返回一个指向该存储空间的地址.in ...
- MongoDB学习笔记(三) 在MVC模式下通过Jqgrid表格操作MongoDB数据
看到下图,是通过Jqgrid实现表格数据的基本增删查改的操作.表格数据增删改是一般企业应用系统开发的常见功能,不过不同的是这个表格数据来源是非关系型的数据库MongoDB.nosql虽然概念新颖,但是 ...