C語言復合字面量的使用

2021-12-30 01:25:39 字數 1480 閱讀 5254

c99增加的特性,復合字面量(composite literal)。一旦熟悉並使用,便會體會到簡潔強大的表達。

所謂字面量就是固定數值的表示。數值和字串型別都有字面量的表達。如:

// 100, 1.23f, literral 都是字面量

int x = 100;

float y = 1.23f;

char* s = literral;

可看到字面構建的同時就可以複製給變數使用。既然是固定數值,那麼在初始化的時候就可以構建。

那麼復合字面量是幾個意思的復合?

composite 除了有復合的意思,也有組合的概念。既然組合,必然陣列是直觀的對應。

所以,復合字面量就是陣列字面量的意思。

曾經,我們是如何定義陣列的。

int arr1 = ;

int arr2[10] = ;

這是最簡單的陣列, 也是一種字面量的定義。然而,這種字面量只能在陣列初始化的時候來使用,並不能賦值操作。int x;

// 正確

x = 100;

int arr[1];

// 錯誤

arr = ;對, 復合字面量,就是可以隨時定義,隨時賦值的陣列字面量。兩步構建出來。

1. 形如 (type) 表示需要構建的陣列型別,如: (int), (int*p), 還能是自定義的型別 (mytype)

2. 跟著 表示陣列內容

int* intarr1 = (int) ;

int* intarr2 = (int[100]) ;

intarr1 = (int) ;

intarr2 = (int[1]) ;

typedef struct array;

array* arr1 = (array) ;

array* arr2 = (array[1]) , 1};

可見,復合字面量,返回的是乙個指標,指向了構建的陣列字面量。

能夠隨時定義出乙個,陣列的字面量指標,能夠讓引數傳遞,初始化結構,更加的簡潔。

舉個例子:

typedef struct array;

void foo(array* arr)

// 曾經的寫法

int data = ;

array arr [1] = ;

foo(arr);

// 現在的寫法

foo((array) , 1 });

表達更為簡潔, 也省去了很多的賦值操作。很多時候,構建字面量的陣列僅僅是為了一次函式呼叫的引數傳遞而已。static array* arr = (array) ,

1};這個例子說明了,初始化乙個結構時候的用法。任何乙個複雜的自定義型別,我們都能夠通過復合文字定義出初始化的字面數值。

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

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

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

復合字面量

復合字面量,是除了符號常量之外的常量,例如 5是int的字面常量,1.2是double的字面常量,a 是char的字面常量,hello 是字串的字面常量。一般來說,字元常量可以方便初始化變數,而且可以用於相應運算。其中較為特殊的還有陣列的復合字面常量。形如 int 2 我們可以通過這樣的字面常量來初...

復合字面量

所謂字面量就是固定數值的表示。數值和字串型別都有字面量的表達。如 100,1.23f,literral 都是字面量 int x 100 float y 1.23f char s literral 可看到字面構建的同一時候就能夠複製給變數使用。既然是固定數值,那麼在初始化的時候就能夠構建。那麼復合字面...

復合字面量

假設給帶int型別形參的函式傳遞乙個值,要傳遞int型別的變數,但是也可以傳遞int型別常量,對於帶陣列形參的函式,情況不同,可以傳遞陣列,但是沒有等價的陣列常量。c99新增了復合字面量 compound ltra 字面量是除符號常量外的常量,例如,5是int型別字面量,81.3是double型別的...