2016-08-30 36 views
1

我們可以在一次性聲明或定義後定義結構變量嗎?所有在了一起單括號像變量聲明完成後一次性完成結構變量初始化/定義

asd = {21,'H'}; 

在那裏被宣佈例如爲:struct asd = {21,'H'};,如果它不能這樣做,因爲它可以在同一行中定義有什麼特別的原因嗎?

struct test 
{ 
    int a; 
    char b; 
}asd; 

asd = {21,'H'}; // error: expected an expression 

詢問C編程。

+0

因爲聚合初始化與賦值不同。 –

+0

fyi:'auto asd = {21,'H'};'不起作用。 'auto asd = {21,22};'不會編譯,但不會執行你所要求的。 –

+6

你能選擇一種語言嗎? c不是C++不是c。 –

回答

0

顯式類型轉換是必需的:

struct test 
{ 
    int a; 
    char b; 
} asd; 

asd = (struct test){21,'H'}; 

此代碼是大致等同於以下之一:

const struct test initialiser = {21,'H'}; 
... 
asd = initialiser; 

不同的是,編譯器有一個選項,以優化的分配值的asd變量使用具有立即值的彙編程序指令時,此優化比const結構複製初始化更有效。

作爲「側」效應此語法是在兩個CC++

+0

@ 2501我不知道它有一個特定的名稱。你能告訴我嗎? – Serge

+0

@nathanoliver 1.對於struct asd [5]可以做同樣的事情;宣佈後?不像*(asd + 3)=(struct tt){-2,'\ 0'};但是對於陣列中的所有元素,如同一行一樣。 2.可以像int ary [5] = {1,22,31,231,5};可以在宣佈後完成?例如:ary =(int){1,22,31,231,5}; – Lpdnn

+0

@Lpdnn不幸的是,不能以這種方式分配數組。唯一的解決方法是使數組成爲結構體的成員; – Serge

0
struct test 
{ 
    int a; 
    char b; 
}asd; 

有效是對structtesttest和類型的變量asd的定義。在;您現在有一個名爲asd的默認構造對象。當你嘗試做

asd = {21, 'H'}; 

您正在嘗試將分配給asd和支撐名單,因爲它沒有一個賦值操作符,需要一個初始化列表將無法正常工作。

您可以初始化asd在聲明它像

struct test 
{ 
    int a; 
    char b; 
}asd = {21, 'H'}; 

或不喜歡

asd = (struct test){21, 'H'}; 

分配如果你選擇使用分配也注意到,它必須在函數內部完成而不是在全球空間。

+0

作業需要在主要的,否則,你會得到這個錯誤:'錯誤:'asd'不會命名一個類型' –

+0

@ArnavBorborah添加了關於。 – NathanOliver

+0

@Lpdnn我正在使用C++語法。我用C語法更新了答案。 – NathanOliver

0

由於@CaptainOblivious提到:

–aggregate initialization is different from assignment.

這意味着什麼,是你不能使用集合初始化賦值爲以後聚合對象,但是不明確的或獨立的,就像這樣:

struct test 
{ 
    int a; 
    char b; 
}asd; 
int main() {asd.a = 21; asd.b = 'H'} 

另一種做法是在稍後顯式地執行(這需要在主程序或另一個代碼塊中完成,否則將出現錯誤(asd does not name a type)):

asd = test{21,'H'} 

你可以做的另一件事情是這樣的:

struct test 
{ 
    int a; 
    char b; 
}asd = {21,'H'}; 

上面兩種情況,將工作爲好,因爲在這裏看到: Live Example

-1

如果定義了該類型的變量,你必須包含struct部分,例如struct asd。但是這個定義和初始化一起工作得很好。

struct test 
{ 
    int a; 
    char b; 
} asd = { 21, 'H'}; 
+0

OP詢問定義和初始化是否可以一次完成,我的答案表明它可以。感謝可愛的downvote。如果你知道的更好,請分享你的知識,這樣我們都可以受益。 –