2016-08-30 3 views
1

Können wir die Strukturvariable nach ihrer Deklaration oder Definition auf einmal definieren? Alle zusammen in einzelnen Klammern wieInitialisierung/Definition der Strukturvariablen auf einmal, nachdem die Variablendeklaration durchgeführt wurde

asd = {21,'H'}; 

einen besonderen Grund, wenn es nicht getan werden kann, da sie in derselben Zeile definiert werden kann, wo es beispiels erklärt wird .: struct asd = {21,'H'};?

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

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

Nach C-Programmierung gefragt.

+0

Da Aggregat Initialisierung unterscheidet sich von Zuweisung. –

+0

fyi: 'auto asd = {21, 'H'};' funktioniert nicht. 'auto asd = {21,22};' kompiliert, tut aber nicht das, wonach Sie fragen. –

+6

Könnten Sie bitte eine Sprache wählen? c ist nicht C++ ist nicht c. –

Antwort

0

Die explizite Typumwandlung ist erforderlich:

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

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

Dieser Code auf den folgenden entspricht in etwa:

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

Der Unterschied besteht darin, dass der Compiler hat eine Option, die Zuordnung eines zu optimieren Wert für die Variable asd mit Assembler-Anweisungen mit Sofortwerten, wenn diese Optimierung effizienter ist als die Initialisierung der Konst-Strukturkopie.

Als "Nebeneffekt" Diese Syntax gilt sowohl C und C++

+0

@ 2501 Ich wusste nicht, dass es einen bestimmten Namen hat. Könntest du mir bitte sagen? – Serge

+0

@natholiver 1. Kann dasselbe für struct asd getan werden [5]; nach seiner Erklärung? Nicht wie * (asd + 3) = (struct tt) {-2, '\ 0'}; Aber für alle Elemente von Array als zusammen in einer Zeile. 2. Können alle normalen Arrays wie int ary [5] = {1,22,31,231,5}; Kann getan werden, nachdem es erklärt wurde? zB: ary = (int) {1,22,31,231,5}; – Lpdnn

+0

@Lpdnn unglücklicherweise nein, Arrays können nicht auf diese Weise zugewiesen werden. Die einzige Problemumgehung besteht darin, ein Array zu einem Mitglied einer Struktur zu machen; – Serge

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

ist die Definition des structtest und die variable asd vom Typ test. Unter der ; haben Sie jetzt ein standardmäßiges konstruiertes Objekt namens asd. Wenn Sie versuchen,

asd = {21, 'H'}; 

Sie zu tun versuchen zu asd und verspannt Liste zuzuordnen, da es nicht funktioniert nicht einen Zuweisungsoperator hat, die eine Initialisierungsliste nimmt.

können Sie entweder initialisieren asd, wenn Sie es wie

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

erklären oder die Zuordnung tun wie

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

Wenn Sie wählten Zuordnung verwenden Sie beachten, dass es in einer Funktion getan werden muss, und nicht im globalen Raum.

+0

Die Zuweisung muss in main sein, sonst erhalten Sie diesen Fehler: 'error: 'asd' nennt keinen Typ' –

+0

@ArnavBorborah Hinzugefügt darüber. – NathanOliver

+0

@ Lpdnn Ich verwendete die C++ Syntax. Ich habe die Antwort mit der C-Syntax aktualisiert. – NathanOliver

0

Wie @CaptainOblivious erwähnt:

–aggregate initialization is different from assignment.

Was dies bedeutet, ist, dass Sie später für aggregierte Objekte Aggregat Initialisierung in Zuordnung verwenden kann nicht, ohne explizite oder getrennt zu sein, wie folgt aus:

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

Eine andere Möglichkeit wäre, später explizit zu sein (dies muss in main oder in einem anderen Codeblock erfolgen, oder Sie erhalten einen Fehler (asd does not name a type)):

asd = test{21,'H'} 

Eine andere Sache, die Sie tun können, ist dies:

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

Beide oben würde auch funktionieren, wie hier zu sehen: Live Example

-1

Wenn Sie definieren eine Variable dieses Typs Sie muss den struct Teil enthalten, wie struct asd. Aber diese Definition und Initialisierung funktioniert zusammen gut.

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

OP fragte, ob die Definition und Initialisierung in einem Schritt erledigt werden kann, und meine Antwort zeigt, dass es möglich ist. Danke für den schönen Downvote. Wenn Sie es besser wissen, teilen Sie uns Ihr Wissen mit, damit wir alle davon profitieren können. –

Verwandte Themen