成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C語言中匿名的最高境界

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

什么是復合字面量?

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

例如10是int的類型的字面量,10.24是double類型的字面量,“lixiaoyao”是字符串的字面量等,如果有數組或者結構體的字面量,這樣使用起來會更方便。

對于數組

數組的復合字面量和數組初始化列表差不多,前面使用括號括起來的類型名,例如下面是一個普通的數組聲明。

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

下面創建了一個和age數組相同的匿名數組,也有兩個int類型值

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

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

初始化有數組名的數組可以省略數組的大小,復合字面量也可以省略大小,編譯器會自動計算數組當前的元素個數:

(int []{19,20,21,22,23}//內含5個元素的復合字面量

因為復合字面量是匿名的,所以不能先創建然后再使用它,必須在創建的同時使用它,如下

int x;
// 正確
x = 100;

int arr[1];
// 錯誤
arr = {0};

一般需要這樣定義使用:

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

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

作為實際參數

復合字面量作為實際參數傳遞給帶有匹配形式參數的函數

#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]);
}
}

輸出結果如下:

圖片

應用于二維數組或者多維數組

這種用法還可以應用于二維或者多維數組,例如下面演示了如何創建二維int數組并存儲其地址

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

對于結構體

假設如下所示聲明了struct foo和structure:

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

這是使用復合字面量構造struct foo的示例:

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

這等效于以下代碼:

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

也可以構造一個數組,如下所述,如果復合字面量的所有元素都是由簡單的常量表達式組成,則可以將復合字面量強制轉換為指向其第一個元素的指針,并在此類初始化程序中使用, 如下所示:

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

標量類型和聯合類型的復合字面量也被允許,在下面的示例中,變量i初始化為值2,該值是由復合字面量創建的未命名對象遞增的結果。

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

作為GNU擴展,GCC允許通過復合字面量初始化具有靜態存儲持續時間的對象,如果復合字面量和對象的類型匹配,則如同僅使用括號括起來的列表初始化對象一樣處理該對象,復合字面量的元素必須是常量。如果要初始化的對象具有未知大小的數組類型,則該大小由復合字面量的大小確定。

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

等效于以下內容:

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

C/C++中的區別

復合字面量看起來像是用括號括起來的聚合初始化程序列表的強制轉換,它的值是強制類型轉換中指定類型的對象,其中包含初始化程序中指定的元素。

與強制轉換的結果不同,復合字面量是左值,但是 C++ 中目前還沒有這種無名左值,作為擴展,GCC在C90模式和C++中也支持復合字面量,但C++語義有所不同。

在C中,復合字面量表示具有靜態或自動存儲持續時間的未命名對象;在C++中,復合字面量表示一個臨時對象,該對象僅在其完整表達式結束之前一直存在。

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

例如,如果上面的數組復合字面量示例出現在函數內部,則C++中對foo的任何后續使用都將具有未定義的行為,因為數組的生存期在聲明foo之后結束。

作為一種優化,g++編譯器有時會給數組復合字面量提供更長的生存期:當數組出現在函數外部或具有const限定類型時。如果foo及其初始化程序的元素類型為??char * const??而不是??char *??,或者foo為全局變量,則該數組將具有靜態存儲持續時間。

責任編輯:龐桂玉 來源: C語言與C++編程
相關推薦

2012-05-04 09:16:32

2009-03-20 21:11:23

多核服務器電腦

2018-11-12 12:50:30

C語言編程匯編

2023-10-27 11:21:20

C語言Multics語言

2023-12-21 11:46:48

C語言柔性數組開發

2009-06-30 10:46:05

多級指針

2010-08-24 16:00:43

C語言

2021-12-06 11:19:47

語言指針內存

2010-01-15 19:17:48

C++語言

2011-05-13 17:25:34

C

2022-01-06 14:25:24

C語言指針內存

2011-03-30 11:01:13

C語言隨機

2010-01-25 17:05:37

C++語言

2009-06-15 08:46:31

虛擬化

2017-06-23 14:36:46

2010-01-18 13:54:28

函數

2011-08-29 09:19:25

c語言

2023-12-29 08:27:36

C語言靜態變量開發

2010-01-21 15:48:38

C++語言

2010-11-17 11:26:49

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品海角社区在线观看 | 黄色片在线免费看 | 欧美在线视频一区二区 | 欧美又大粗又爽又黄大片视频 | 日韩欧美中文字幕在线观看 | 欧美激情在线一区二区三区 | 成人天堂 | 国产精品一区二区av | 国产精品自产av一区二区三区 | 日韩午夜电影在线观看 | 久久久精品视频免费 | 色婷婷亚洲国产女人的天堂 | 婷婷久久综合 | 久久久国产一区 | 国产精品视频导航 | 99资源| 中文字幕一级毛片视频 | 国产视频第一页 | 一区二区免费在线视频 | 欧美黄页| 国产精品久久久久久久免费观看 | 国产精品久久久久久久久久免费看 | 91看片在线观看 | 国产剧情久久 | 色综合久久伊人 | 亚洲综合热 | av网站在线看 | 精品久久久久久久久久久久 | 亚洲一区二区三区四区在线观看 | 国产精品欧美精品 | 精品国产黄色片 | 国产欧美日韩综合精品一区二区 | 日本人做爰大片免费观看一老师 | h片免费在线观看 | 99国产精品久久久久老师 | 国产小视频在线 | 国产精品色 | 18av在线播放 | 国产精品网址 | 一级少妇女片 | www免费视频 |