SE1 Klausur
2008-02-28 18:05
Fred
Heute war doch SE1 Klausur, wenn mich nicht alles täuscht. Wie lief es denn so?
int[] intArray = new int[5];
for(int i : intArray)
{
i = 42;
}
int j = intArray[0];
Unter den Antworten, die hier anzukreuzen waren, sollte gewesen sein (nochmal: korrigiert mich wenn ich etwas falsch wiedergebe):In der Veranstaltung und in den Übungen wurden wir (man korrigiere mich wenn ich mich täusche) darauf hingewiesen, dass es am besten sei, Variablen und Arrays immer selbst zu initialisierenIn Bezug auf Variablen gebe ich Dir Recht. Aber wurde das bezogen auf Arrays wirklich so gesagt? Wie sähe eine solche Initialisierung eines Arrays aus?
Die Situation, eine Variable zu benutzen ohne sie zu initialisieren, sollte deshalb gar nicht erst auftreten (und wird ja auch im Normalfall vom Compiler als Warnung angemerkt).Nein. Eine Exemplarvariable kannst Du deklarieren, ohne sie explizit zu initialisieren, weil sie implizit mit einem Standardwert initialisiert wird, bevor der eigentliche Konstruktor durchläuft. Da warnt der Compiler nicht.
(Noch mal explizit für alle Zweifler und Nicht-Hinterher-Ausprobierer: Der Array wird wirklich nicht mit 42 gefüllt.) Das ist schön und gut und sicher auch sinnvoll zu wissen, aber wurde nicht immer gesagt, dass wir uns darauf eben nicht verlassen sollen?Du kannst Dich darauf verlassen, dass Array-Elemente beim Erzeugen des Arrays mit default-Werten gefüllt werden. Das steht auf Folie 13 des vierten Skriptteils. Man KANN auch die Werte explizit in einem Array-Initializer hinschreiben:
int[] intArray = {0,0,0,0,0}
Es wurde gefragt, ob die Einhaltung der Quelltextkonventionen sowie ein paar andere Dinge "zur Übersetzungszeit eindeutig bestimmbar bzw. relevant" sind. Was soll dieses "relevant" mir sagen? […] Ich hatte deshalb gezweifelt, da Quelltextkonventionen für die Übersetzung ja gerade nicht relevant sind.Für die Übersetzung sind die Konventionen egal. Aber es geht nicht um die Übersetzung, sondern um die Übersetzungszeit (als Abgrenzung zur Laufzeit). "Zur Übersetzungszeit" heißt, dass man sich den ausgedruckten Quelltext anschaut, da ein bischen mit Bleistift rummalt und zu tollen Erkenntnissen kommt [23]
In Bezug auf Variablen gebe ich Dir Recht. Aber wurde das bezogen auf Arrays wirklich so gesagt? Wie sähe eine solche Initialisierung eines Arrays aus?Mag sein, dass es bei Arrays nicht in der Form gesagt wurde, dann irre ich mich da. Ein Array lässt sich z.B. mit einer for-Schleife sehr gut mit einem bestimmten Wert füllen.
Nein. Eine Exemplarvariable kannst Du deklarieren, ohne sie explizit zu initialisieren, weil sie implizit mit einem Standardwert initialisiert wird, bevor der eigentliche Konstruktor durchläuft. Da warnt der Compiler nicht.Nehmen wir mal die Frage die direkt über der von eben stand:
Lokale Variablen brauchst Du auch nicht bei der Deklaration zu initialisieren (ist aber guter Stil - da sind wir wieder beim Begriff "Pragmatik"), Du MUSST sie allerdings vor dem ersten Lesen beschreiben (siehe "definite assignment" in der JLS). Wenn der Compiler sieht, dass Du eine unbeschriebene Variable ausliest, bekommst Du einen FEHLER, keine Warnung.
Man kann also in Java niemals und unter keinen Umständen irgendwelche Müllwerte aus Variablen auslesen.
int[] intArray;
// hier noch mehr Zeug glaub ich
int i = intArray[0];
Was passiert dann hier? Ich habe angekreuzt "Es wird eine Exception geworfen" (da kein Array-Objekt existiert). Hat i danach einen definierten Wert oder bringt die Exception sowieso alles zum Erliegen?Für die Übersetzung sind die Konventionen egal. Aber es geht nicht um die Übersetzung, sondern um die Übersetzungszeit (als Abgrenzung zur Laufzeit). "Zur Übersetzungszeit" heißt, dass man sich den ausgedruckten Quelltext anschaut, da ein bischen mit Bleistift rummalt und zu tollen Erkenntnissen kommt [23]Heißt es das wirklich immer? Das war mir nicht klar. Ich dachte, mit "Übersetzungszeit" wäre der Zeitpunkt/Zeitraum gemeint, in dem der Code vom Compiler übersetzt wird - denn in dem Moment/Zeitraum ist die Lesbarkeit des Quelltextes ja tatsächlich irrelevant. (Angekreuzt habe ich's halt trotzdem, da's ja trotzdem eindeutig bestimmbar ist). Vielleicht liegt das also wirklich nur an meiner Interpretation der Frage. Selbst als Informatik-Erstsemester lernt man noch was neues. ;)
Nehmen wir mal die Frage die direkt über der von eben stand:Solange in "// hier noch mehr Zeug glaub ich" kein Array erzeugt und i zugewiesen wird, hast Du Recht, es wird eine Exception geworfen. Ein "danach" gibt es nicht, man kann also nicht herausfinden, was in i ist. In der JLS wird das mit "abrupt termination" bezeichnet.int[] intArray; // hier noch mehr Zeug glaub ich int i = intArray[0];
Was passiert dann hier? Ich habe angekreuzt "Es wird eine Exception geworfen" (da kein Array-Objekt existiert). Hat i danach einen definierten Wert oder bringt die Exception sowieso alles zum Erliegen?
Nein, damit wird kein Zeitraum beschrieben. "Zur Übersetzungszeit" heißt "statisch anhand des Quelltexts feststellbar", "zur Laufzeit" heißt "erst feststellbar, wenn das Programm läuft.""Zur Übersetzungszeit" heißt, dass man sich den ausgedruckten Quelltext anschaut, da ein bischen mit Bleistift rummalt und zu tollen Erkenntnissen kommt [23]Heißt es das wirklich immer? Das war mir nicht klar. Ich dachte, mit "Übersetzungszeit" wäre der Zeitpunkt/Zeitraum gemeint, in dem der Code vom Compiler übersetzt wird
Nehmen wir mal die Frage die direkt über der von eben stand:Solange in "// hier noch mehr Zeug glaub ich" kein Array erzeugt und i zugewiesen wird, hast Du Recht, es wird eine Exception geworfen. Ein "danach" gibt es nicht, man kann also nicht herausfinden, was in i ist. In der JLS wird das mit "abrupt termination" bezeichnet.int[] intArray; // hier noch mehr Zeug glaub ich int i = intArray[0];
Was passiert dann hier? Ich habe angekreuzt "Es wird eine Exception geworfen" (da kein Array-Objekt existiert). Hat i danach einen definierten Wert oder bringt die Exception sowieso alles zum Erliegen?
Im Prinzip ist die ganze frage sowieso quatsch, es wird auch keine Exception geworfen, weil das ganze sich garnicht kompilieren lässt. Aber gehen wir mal davon aus, intArray sei eine Exemplar-VariableHä? intArray ist hier eine ganz normale lokale Variable. Wo soll da das Problem sein?
Nein, damit wird kein Zeitraum beschrieben. "Zur Übersetzungszeit" heißt "statisch anhand des Quelltexts feststellbar", "zur Laufzeit" heißt "erst feststellbar, wenn das Programm läuft."Habe da nun nochmal nachgesehen… Foliensatz 2, Folie 68:
Übersetzungszeit (engl.: compile time) ist die Zeit, in der ein Compiler den in einer Programmiersprache geschriebenen Quelltext in eine ausführbare Form übersetzt.Das sollte dann vielleicht mal angepasst werden…?
Habe da nun nochmal nachgesehen… Foliensatz 2, Folie 68:Hab mir die Folien gerade angesehen. Da steht doch genau das, was ich sagte [25]Übersetzungszeit (engl.: compile time) ist die Zeit, in der ein Compiler den in einer Programmiersprache geschriebenen Quelltext in eine ausführbare Form übersetzt.
Hier sind die statischen Eigenschaften von Programmen relevant:
[Syntax, Sichtbarkeit, Struktur, Lesbarkeit, Konventionen…]
Hab mir die Folien gerade angesehen. Da steht doch genau das, was ich sagte [25]Hier sind die statischen Eigenschaften von Programmen relevant:
[Syntax, Sichtbarkeit, Struktur, Lesbarkeit, Konventionen…]
In computer science, compile time refers to either the operations performed by a compiler (the "compile-time operations") or programming language requirements that must be met by source code for it to be successfully compiled (the "compile-time requirements").
The operations performed at compile time usually include syntax analysis, various kinds of semantic analysis (e.g., type checks and instantiation of template) and code generation.
[…]
"Compile time" can also refer to the amount of time required for compilation.
hmm, ich würde quelltextkonventionen nichtmal als eigenschaft des programms bezeichnen.Sind Kommentare auch keine Eigenschaft des Programms?
programme können ja auch mit unterschiedlichen quelltextkonventionen äquivalent sein.Nehmen wir die folgenden Methoden als Beispiel (ich verstehe eine Methode hier als Unterprogramm):
boolean a(int x, int y)
{
if (x < y)
return true;
else
return false;
}
boolean b(int x, int y)
{
boolean result;
if (x < y)
result = true;
else
result = false;
return result;
}
boolean c(int x, int y)
{
return x < y ? true : false;
}
boolean d(int x, int y)
{
return x < y;
}
Diese vier Programme sind grundsätzlich unterschiedlich. Anhänger verschiedener Quelltextkonventionen werden verschiedene Lösungen als optimal bezeichnen. Manche sagen "nur ein return pro Methode", andere sagen "ternary operators are evil" etc.quelltextkonventionen in eine schublade mit syntax und struktur zu werfen… nee, das passt irgendwie nicht [25]Wenn ich Dich frage, ob Person X bei Programm Y die Quelltextkonventionen eingehalten hat, was machst Du dann?
Das ist doch nicht das erste Mal, dass ein Begriff in der Informatik mehrere Bedeutungen hat [25]Geschenkt soweit, ergibt alles Sinn. Aber hier schließt sich auch der Kreis zurück zur Klausur: Für die sollte idealerweise die Definition gelten, die im Skript steht. Aber okay, das wird hier zur Erbsenzählerei. :)
hier schließt sich auch der Kreis zurück zur KlausurJetzt würde mich natürlich nochmal der genaue Wortlaut der Aufgabe interessieren…
Sind Kommentare auch keine Eigenschaft des Programms?
Diese vier Programme sind grundsätzlich unterschiedlich. Anhänger verschiedener Quelltextkonventionen werden verschiedene Lösungen als optimal bezeichnen. Manche sagen "nur ein return pro Methode", andere sagen "ternary operators are evil" etc.
Es sind verschiedene Programme - aber die Semantik ist gleich. Vielleicht meintest Du das.
kann zufällig jemand sagen wann wir die Klausurergebnisse kriegen werden?
Klausurergebnisse gibt es voraussichtlich nächste Woche, frühestens ab Mittwoch (5.3.).
STINE […] Kalendervergiss den kalender. der hinkt der realität immer ein bischen hinterher.