Archiv verlassen und diese Seite im Standarddesign anzeigen : Ziemliche Anfängerfragen zur Schreibweise
Folgende Fragen outen mich natürlich als ziemlichen Noob. Ich nutze D und er kompiliert beides klaglos.
int feld1[];
feld1.length=20;
int feld2[] = new int[20];
Was ist der Unterschied bei diesen Statements? Interessanterweise kann man nicht die Length-Eigenschaft ändern, wenn man schreibt
int feld1[20];
Warum eigentlich nicht?
Mangels wirklicher D-Kenntnisse kann ich nur Vermutungen äussern, die da lauten:
Der Unterschied zwischen erstem und zweitem Code-Schnipsel besteht darin, dass im zweiten direkt eine Initialisierung erfolgt. Im ersten deklarierst du feld1 zunächst nur, und mit dem Zuweisen eines length-Wertes wird offenbar implizit initialisert.
Das dritte Schnipsel funktioniert nicht, weil die Syntax "feld1[20]" den Zugriff auf das 21. Element von feld1 beschreibt. Der Compiler motzt aus zwei Gründen:
1. Weil er von links nach rechts liest, und deswegen an dieser Stelle zunächst eine Deklaration erwartet: "int " ist der Anfang einer Deklaration
2. Weil die Variable feld1 an dieser Stelle noch nicht existiert, kann auch nicht auf das 21. Element davon zugegriffen werden.
Das klingt einleuchtend. Danke.
Matrix316
2013-08-14, 16:53:14
Der dritte Code versucht dir wieder ein neues feld1 Array anzulegen. Da es aber schon ein feld1 gibt, sollte es deswegen (wenn genau so geschrieben)
int feld1[];
feld1.length=20;
int feld1[20];
einen Fehler geben.
Wegen dem Index sollte es nur einen Fehler geben, wenn du drauf zugreifst
feld1[20] = 2;
int iWert = feld1[20];
oder so.
patermatrix
2013-08-14, 23:23:44
Der dritte Code versucht dir wieder ein neues feld1 Array anzulegen.
Nein. Samm hat das in seinem 1. Punkt richtig erklärt.
Mal eine Frage aus Interesse (kenne D nicht):
int feld1[];
feld1.length=20;
Dass das kompiliert ist klar, aber lässt sich das auch ausführen?
Da "feld1" nicht initialisiert wird, sollte es beim Zugriff auf "length" meiner Erwartung nach einen Fehler geben.
Oder wird da implizit initialisiert?
Ectoplasma
2013-08-15, 01:10:40
Mal eine Frage aus Interesse (kenne D nicht):
Dass das kompiliert ist klar, aber lässt sich das auch ausführen?
Da "feld1" nicht initialisiert wird, sollte es beim Zugriff auf "length" meiner Erwartung nach einen Fehler geben.
Oder wird da implizit initialisiert?
Ich kenne D zwar auch nicht, aber es scheint bei der Zuweisung an length, eine Allozierung zu erfolgen, falls der Speicher vorher kleiner war, weshalb int feld2[] = new int[20]; und int feld1[];
feld1.length=20; auch equivalent ist.
Ectoplasma
2013-08-15, 01:16:45
Ach ja zur Frage:
Diese Schreibweise "int feld2[] = new int[20];", ist erheblich verständlicher, als die andere Schreibweise mit der Zuweisung an length. Wohlgemerkt, fast jede Sprache hat ein ähnliches Konstrukt bei Vektoren. Ich habe aber noch nie gesehen, dass man bei der initialen Anlage eines Vectors die Größe, falls sie vorher bekannt sein sollte, diese erst später dem Vector mitteilt. Das ist eher ein unüblicher Stil.
vBulletin®, Copyright ©2000-2025, Jelsoft Enterprises Ltd.