程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> C語言復合字面量的使用

C語言復合字面量的使用

編輯:關於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
};
這個例子說明了,初始化一個結構時候的用法。任何一個復雜的自定義類型,我們都能夠通過復合文字定義出初始化的字面數值。

 

這在構建一些需要初始化的固定數據結構很有用處。

 

 

還有, 復合文字可以做左值。無論字面數值創建在棧上還是在堆上,都可以被賦值。

這就厲害了,可以發揮想象,有更多的黑魔法有待發掘。

 

 


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved