自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

C語(yǔ)言中匿名的最高境界

開發(fā) 后端
C語(yǔ)言中有沒有見過??(int [2]){19,20}??或者??int (*pt2)[4]??的使用方法,字面上可能不好理解,這是C99之后才新增的知識(shí)點(diǎn),名為??復(fù)合字面量(Compound Literals)??,一旦熟悉使用,便會(huì)體會(huì)到它簡(jiǎn)潔而強(qiáng)大的表達(dá)。

什么是復(fù)合字面量?

假設(shè)給帶int類型的形參函數(shù)傳遞一個(gè)值,可以傳遞int類型的變量,也可以傳遞int類型常量,但是對(duì)于帶數(shù)組形參的函數(shù)則不一樣,可以傳遞數(shù)組,但是不支持傳遞數(shù)組常量,由此C99新增了復(fù)合字面量的用法,字面量是指除符號(hào)常量外的常量。

例如10是int的類型的字面量,10.24是double類型的字面量,“l(fā)ixiaoyao”是字符串的字面量等,如果有數(shù)組或者結(jié)構(gòu)體的字面量,這樣使用起來(lái)會(huì)更方便。

對(duì)于數(shù)組

數(shù)組的復(fù)合字面量和數(shù)組初始化列表差不多,前面使用括號(hào)括起來(lái)的類型名,例如下面是一個(gè)普通的數(shù)組聲明。

??int age[2]=[19,20];??

下面創(chuàng)建了一個(gè)和age數(shù)組相同的匿名數(shù)組,也有兩個(gè)int類型值

??(int [2]){19,20}; //復(fù)合字面量??

注意去掉申明中的數(shù)組名,留下的??int[2]??就是復(fù)合字面量的類型名。

初始化有數(shù)組名的數(shù)組可以省略數(shù)組的大小,復(fù)合字面量也可以省略大小,編譯器會(huì)自動(dòng)計(jì)算數(shù)組當(dāng)前的元素個(gè)數(shù):

(int []{19,20,21,22,23}//內(nèi)含5個(gè)元素的復(fù)合字面量

因?yàn)閺?fù)合字面量是匿名的,所以不能先創(chuàng)建然后再使用它,必須在創(chuàng)建的同時(shí)使用它,如下

int x;
// 正確
x = 100;

int arr[1];
// 錯(cuò)誤
arr = {0};

一般需要這樣定義使用:

int *pt1;
pt1=(int[2]){19,20};

注意,該復(fù)合字面量的字面常量與上面創(chuàng)建age數(shù)組的字面常量完全相同,復(fù)合字面的類型名也代表著首元素的地址,所以可以把它賦給指向int的指針。

作為實(shí)際參數(shù)

復(fù)合字面量作為實(shí)際參數(shù)傳遞給帶有匹配形式參數(shù)的函數(shù)

#include <stdio.h>
int sum(const int age[],int n);

int main () {
int total;
total =sum((int[]){4,4,4,5,5,5},6);
return 0;
}

int sum(const int age[],int n){
int i=0;
for(i=0;i<n;i++){
printf("age is %d\n",age[i]);
}
}

輸出結(jié)果如下:

圖片

應(yīng)用于二維數(shù)組或者多維數(shù)組

這種用法還可以應(yīng)用于二維或者多維數(shù)組,例如下面演示了如何創(chuàng)建二維int數(shù)組并存儲(chǔ)其地址

int (*pt2)[4];
//申明一個(gè)指向二維數(shù)組的指針,該數(shù)組內(nèi)有2個(gè)數(shù)組元素
//每個(gè)元素是內(nèi)含4個(gè)int類型值的數(shù)組
pt2 = (int [2][4]) {{1,2,3,4,},{5,6,7,8,}};

對(duì)于結(jié)構(gòu)體

假設(shè)如下所示聲明了struct foo和structure:

struct foo {
int a;
char b[2];
} structure;

這是使用復(fù)合字面量構(gòu)造struct foo的示例:

structure = ((struct foo) {x + y, 'a', 0});

這等效于以下代碼:

{
struct foo temp = {x + y, 'a', 0};
structure = temp;
}

也可以構(gòu)造一個(gè)數(shù)組,如下所述,如果復(fù)合字面量的所有元素都是由簡(jiǎn)單的常量表達(dá)式組成,則可以將復(fù)合字面量強(qiáng)制轉(zhuǎn)換為指向其第一個(gè)元素的指針,并在此類初始化程序中使用, 如下所示:

char **foo = (char *[]) { "x", "y", "z" };

標(biāo)量類型和聯(lián)合類型的復(fù)合字面量也被允許,在下面的示例中,變量i初始化為值2,該值是由復(fù)合字面量創(chuàng)建的未命名對(duì)象遞增的結(jié)果。

int i = ++(int){1};

作為GNU擴(kuò)展,GCC允許通過復(fù)合字面量初始化具有靜態(tài)存儲(chǔ)持續(xù)時(shí)間的對(duì)象,如果復(fù)合字面量和對(duì)象的類型匹配,則如同僅使用括號(hào)括起來(lái)的列表初始化對(duì)象一樣處理該對(duì)象,復(fù)合字面量的元素必須是常量。如果要初始化的對(duì)象具有未知大小的數(shù)組類型,則該大小由復(fù)合字面量的大小確定。

static struct foo x = (struct foo) {1, 'a', 'b'};
static int y[] = (int []) {1, 2, 3};
static int z[] = (int [3]) {1};

等效于以下內(nèi)容:

static struct foo x = {1, 'a', 'b'};
static int y[] = {1, 2, 3};
static int z[] = {1, 0, 0};

C/C++中的區(qū)別

復(fù)合字面量看起來(lái)像是用括號(hào)括起來(lái)的聚合初始化程序列表的強(qiáng)制轉(zhuǎn)換,它的值是強(qiáng)制類型轉(zhuǎn)換中指定類型的對(duì)象,其中包含初始化程序中指定的元素。

與強(qiáng)制轉(zhuǎn)換的結(jié)果不同,復(fù)合字面量是左值,但是 C++ 中目前還沒有這種無(wú)名左值,作為擴(kuò)展,GCC在C90模式和C++中也支持復(fù)合字面量,但C++語(yǔ)義有所不同。

在C中,復(fù)合字面量表示具有靜態(tài)或自動(dòng)存儲(chǔ)持續(xù)時(shí)間的未命名對(duì)象;在C++中,復(fù)合字面量表示一個(gè)臨時(shí)對(duì)象,該對(duì)象僅在其完整表達(dá)式結(jié)束之前一直存在。

所以,定義良好的C代碼(采用復(fù)合字面量的子對(duì)象的地址)可以在C++中未定義,因此g++編譯器不能將臨時(shí)數(shù)組轉(zhuǎn)換為指針。

例如,如果上面的數(shù)組復(fù)合字面量示例出現(xiàn)在函數(shù)內(nèi)部,則C++中對(duì)foo的任何后續(xù)使用都將具有未定義的行為,因?yàn)閿?shù)組的生存期在聲明foo之后結(jié)束。

作為一種優(yōu)化,g++編譯器有時(shí)會(huì)給數(shù)組復(fù)合字面量提供更長(zhǎng)的生存期:當(dāng)數(shù)組出現(xiàn)在函數(shù)外部或具有const限定類型時(shí)。如果foo及其初始化程序的元素類型為??char * const??而不是??char *??,或者foo為全局變量,則該數(shù)組將具有靜態(tài)存儲(chǔ)持續(xù)時(shí)間。

責(zé)任編輯:龐桂玉 來(lái)源: C語(yǔ)言與C++編程
相關(guān)推薦

2012-05-04 09:16:32

2009-03-20 21:11:23

多核服務(wù)器電腦

2010-01-15 19:17:48

C++語(yǔ)言

2011-05-13 17:25:34

C

2022-01-06 14:25:24

C語(yǔ)言指針內(nèi)存

2023-12-21 11:46:48

C語(yǔ)言柔性數(shù)組開發(fā)

2009-06-30 10:46:05

多級(jí)指針

2021-12-06 11:19:47

語(yǔ)言指針內(nèi)存

2023-10-27 11:21:20

C語(yǔ)言Multics語(yǔ)言

2010-08-24 16:00:43

C語(yǔ)言

2018-11-12 12:50:30

C語(yǔ)言編程匯編

2011-03-30 11:01:13

C語(yǔ)言隨機(jī)

2010-01-18 13:54:28

函數(shù)

2023-12-29 08:27:36

C語(yǔ)言靜態(tài)變量開發(fā)

2011-08-29 09:19:25

c語(yǔ)言

2010-01-21 15:48:38

C++語(yǔ)言

2010-01-25 17:05:37

C++語(yǔ)言

2009-06-15 08:46:31

虛擬化

2017-06-23 14:36:46

2010-03-11 19:16:32

Python語(yǔ)言
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)