第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

C和C ++:自動結(jié)構(gòu)的部分初始化

C和C ++:自動結(jié)構(gòu)的部分初始化

C++ C
瀟瀟雨雨 2019-08-01 14:41:21
C和C ++:自動結(jié)構(gòu)的部分初始化例如,如果somestruct有三個整數(shù)成員,我一直認(rèn)為在C(或C ++)函數(shù)中執(zhí)行此操作是可以的:somestruct s = {123,};第一個成員將初始化為123,最后兩個成員將初始化為0.我經(jīng)常對自動數(shù)組執(zhí)行相同的操作,寫入int arr[100] = {0,};以便將數(shù)組中的所有整數(shù)初始化為零。最近我在GNU C參考手冊中讀到:如果不初始化結(jié)構(gòu)變量,則效果取決于它是否具有靜態(tài)存儲(請參閱存儲類說明符)。如果是,則使用0初始化具有整數(shù)類型的成員,并將指針成員初始化為NULL; 否則,結(jié)構(gòu)成員的價值是不確定的。有人可以告訴我C和C ++標(biāo)準(zhǔn)對部分自動結(jié)構(gòu)和自動數(shù)組初始化的看法嗎?我在Visual Studio中執(zhí)行上述代碼沒有問題,但我希望與gcc / g ++兼容,也可能與其他編譯器兼容。謝謝
查看完整描述

3 回答

?
慕后森

TA貢獻1802條經(jīng)驗 獲得超5個贊

鏈接的gcc文檔沒有談到部分初始化它只談到(完成)初始化沒有初始化

什么是部分初始化?

標(biāo)準(zhǔn)沒有定義對象的部分初始化,要么是完全初始化,要么是無初始化。部分初始化是一種非標(biāo)準(zhǔn)術(shù)語,通常指的是您提供一些初始化器但不是全部的情況,即:初始化器的數(shù)量少于陣列的大小或初始化的結(jié)構(gòu)元素的數(shù)量。

例:

int array[10] = {1,2};                    //Case 1:Partial Initialization

什么是(完整)初始化或無初始化?

初始化意味著在創(chuàng)建變量的同時為創(chuàng)建的變量提供一些初始值。即:在相同的代碼語句中。

例:

int array[10] = {0,1,2,3,4,5,6,7,8,9};    //Case 2:Complete Initializationint array[10];                            //Case 3:No Initialization

引用的段落描述了行為Case 3。

關(guān)于部分初始化(Case 1)的規(guī)則由標(biāo)準(zhǔn)很好地定義,并且這些規(guī)則不依賴于被初始化的變量的存儲類型。
AFAIK,所有主流編譯器都100%遵守這些規(guī)則。


有人可以告訴我C和C ++標(biāo)準(zhǔn)對部分自動結(jié)構(gòu)和自動數(shù)組初始化的看法嗎?

C和C ++標(biāo)準(zhǔn)保證即使整數(shù)數(shù)組位于自動存儲上,并且如果括號括起的列表中的初始化程序較少,則必須將未初始化的元素初始化為0。

C99標(biāo)準(zhǔn)6.7.8.21

如果括號括起的列表中的初始值設(shè)定項少于聚合的元素或成員,或者用于初始化已知大小的數(shù)組的字符串文字中的字符數(shù)少于數(shù)組中的元素,則聚合的其余部分應(yīng)為隱式初始化與具有靜態(tài)存儲持續(xù)時間的對象相同。


在C ++中,規(guī)則的陳述略有不同。

C ++ 03標(biāo)準(zhǔn)8.5.1聚合
第7段:

如果列表中的初始值設(shè)定項少于聚合中的成員,則未明確初始化的每個成員都應(yīng)進行值初始化(8.5)。[例:

 struct S { int a; char* b; int c; };
 S ss = { 1, "asdf" };

初始化ss.awith 1,ss.bwith "asdf"ss.cwith表達式的表達式int(),即0。]

值初始化定義于,
C ++ 03 8.5 Initializers 
Para 5:

值初始化類型的物體T是指:
-如果T是一個類型(第9節(jié))與用戶聲明的構(gòu)造(12.1),然后對T中的默認(rèn)構(gòu)造函數(shù)被調(diào)用(以及初始化是形成不良的如果T沒有可訪問的默認(rèn)構(gòu)造函數(shù)); 
- 如果T是沒有用戶聲明的構(gòu)造函數(shù)的非聯(lián)合類類型,則T的每個非靜態(tài)數(shù)據(jù)成員和基類組件都是值初始化的; 
- 如果T是數(shù)組類型,則每個元素都是值初始化的; 
- 否則,對象被零初始化


查看完整回答
反對 回復(fù) 2019-08-01
?
aluckdog

TA貢獻1847條經(jīng)驗 獲得超7個贊

在C中,對象永遠不會被部分初始化 - 如果它們的任何部分被初始化,則初始化整個對象(以及遞歸的所有子對象)。如果沒有提供顯式初始化器,則將元素初始化為“適當(dāng)類型的零”。

您的問題中的引用是指完全遺漏整個對象的初始化程序,而不是指子對象缺少初始化程序時。例如,假設(shè)arr具有自動存儲持續(xù)時間,那么:

int arr[100] = { 123 };

初始化arr[0]123與所有其他元素arr0。鑒于此:

int arr[100];

留下arr未初始化的每一個元素。引用的是后一種情況。


查看完整回答
反對 回復(fù) 2019-08-01
?
慕村225694

TA貢獻1880條經(jīng)驗 獲得超4個贊

最新的gcc版本也允許同時“部分”初始化和zeromem:

typedef struct{
  int a,b,c;}T;T s = {0, .b=5};

struct成員現(xiàn)在將具有以下值: a=0, b=5, c=0

我沒有關(guān)于其他編譯器是否允許這樣做的任何信息:p


查看完整回答
反對 回復(fù) 2019-08-01
  • 3 回答
  • 0 關(guān)注
  • 595 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號