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语言复合字面量的使用的更多相关文章

  1. 字面量(literal)与 C 语言复合字面量(compound literals)

    在计算机科学中,字面量(literal)是用于表达源代码中一个固定值的表示法(notation)(字面量是相对变量常量等定义的,无论是常量还是变量,其值在某一时刻总是确定的,只是变量可以反复赋值.刷新 ...

  2. (C99)复合字面量

    #include <stdio.h> struct argvs { char a[64]; int b; }; int pfunc(struct argvs *a) { printf(&q ...

  3. 【Go入门教程2】基本构成元素:标识符(identifier)、关键字(keyword 25个)、字面量(literal)、分隔符(delimiter)、和 操作符(operator)

    基本构成要素 Go 的语言符号 又称 词法元素,共包括 5 类内容——标识符(identifier).关键字(keyword).字面量(literal).分隔符(delimiter) 和 操作符(op ...

  4. C语言 字面量

    在计算机科学中,字面量(literal)是用于表达源代码中一个固定值的表示法(notation). 几乎所有计算机编程语言都具有对基本值的字面量表示,诸如:整数.浮点数以及字符串: 而有很多也对布尔类 ...

  5. c语言中的字面量

    在计算机科学中,字面量(literal)是用于表达源代码中一个固定值的表示法(notation). 几乎所有计算机编程语言都具有对基本值的字面量表示,诸如:整数.浮点数以及字符串: 而有很多也对布尔类 ...

  6. Swift语言指南(五)--数字字面量和数字类型转换

    原文:Swift语言指南(五)--数字字面量和数字类型转换 数字字面量 整数字面量写法如下: · 十进制数,无前缀 · 二进制数,以 0b 为前缀 · 八进制数,以 0o 为前缀 · 十六进制数,以 ...

  7. Go语言中初始化变量中字面量&Type{}、new、make的区别

    Go语言中new和make是内建的两个函数,主要用来创建分配类型内存.在我们定义生成变量的时候,可能会觉得有点迷惑,其实他们的规则很简单,下面我们就通过一些示例说明他们的区别和使用. 变量的声明 va ...

  8. (52)Wangdao.com第七天_字面量/变量_标识符_数据类型_数据的存储

    JavaScript 字面量 和 变量 字面量:就是那些不可变的值,如1,2,100,2000,Infinity,NaN 变量: 变量,代表的当前随机分配的内存地址. 变量的值,是可变的,可以用来保存 ...

  9. java的数据类型、自动拆装箱、字面量

    java 中的数据类型分为两大类:值类型(基本数据类型)和引用类型(复合数据类型)  值类型分为 1,整数类型(byte,short,int,long) 2,浮点类型(float,double) 3, ...

随机推荐

  1. Linux内核-系统调用

    Linux内核-系统调用 1.与内核通信 #系统调用在用户空间进程和硬件设备之间添加了一个中间层 作用:1.为用户空间提供了一种硬件的抽象接口 2.系统调用保证了系统的稳定和安全 3.出于每一个进程都 ...

  2. OC中多线程的一些概念

    1.进程1.1>进程是指在系统中正在运行的一个应用程序(同时打开QQ和Xcode,系统会分别启动2个进程)1.2>每个进程之间是独立的,每个进程均运行在其专用的且受保护的内存空间内 2.线 ...

  3. 终于懂了:Delphi消息的Result完全是生造出来的,不是Windows消息自带的(Delphi对Windows编程体系的改造越大,学习收获就越大)——消息是否继续传递就看这个Result

    Windows中,消息使用统一的结构体(MSG)来存放信息,其中message表明消息的具体的类型, 而wParam,lParam是其最灵活的两个变量,为不同的消息类型时,存放数据的含义也不一样. t ...

  4. 使用ssh远程执行命令批量导出数据库到本地(转)

    前天正在跟前端的同事调试功能.服务器开好,模拟的玩家登录好,就在倒计时.这时突然运营的同事跑过来说要统计几个服务器玩家的一些情况,也就是需要从几个服的数据库导出部分玩家的数据.好吧,我看了一下时间,1 ...

  5. HDU 1599 find the mincost route (无向图floyd最小环详解)

    转载请注明出处:http://blog.csdn.net/a1dark 分析:终于弄懂了floyd的原理.以前的理解一直肤浅.所以一做到floyd应用的题.就拙计了.其实floyd的本质DP.利用前K ...

  6. Android Gradle Plugin指南(六)——高级构建定制

    原文地址:http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Advanced-Build-Customization ...

  7. sqlserver 存储过程实例

    ALTER PROC [dbo].[SP_mm_NS] (        @ID        NVARCHAR(60),        @ReturnCode    NVARCHAR(30) OUT ...

  8. MSSQL - 多表查询

    SELECT u.UserNumber, u.UserName, c.CarNumber, c.CarName, c.CarEngine, s.BuyLs, s.BuyTime FROM Tb_Sal ...

  9. sql: update from

    sql server提供了update的from 子句,可以将要更新的表与其它的数据源连接起来.虽然只能对一个表进行更新,但是通过将要更新的表与其它的数据源连接起来,就可以在update的表达式 中引 ...

  10. VC环境下编译OpenSSL(仅仅是个示例,网上还有许多相关文章)

    VC环境OpenSSL安装以及编程过程 SSL就是Secure Sockets Layer,是一种安全套接字协议,详情请参考链接中的介绍. 配置过程中需要生成一些mak文件,这些生成代码用perl脚本 ...