Samelsarium Grundlegender Fragen 2

Bitte aktiviere JavaScript!
Vielen Dank für eure bisherige Hilfe, zurzeit beschäftigen mich folgende Fragen:

1. Warum hat bei folgendem Ausdruck das logische Und einen höheren Rank als das logische Oder(hier als II) (trotz gegenteiliger Aussage in der Operatinenrangtabelle)? System.out.println(A&&B II C)?

2. Was versteht man unter folgender Aussage (aus dem Openbook S.133): "Auch wenn Ausdrücke wie a()+b()*c() zuerst das Produkt gebildet wird, schreibt doch die Auswertungsreihenfolge von binären Operatoren vor, das der linke Operand zuerst ausgewertet werden muss, was bedeutet, dass Java zuerst die Methode a() aufruft." Was versteht man unter der Auswertugnsreihenfolge von binären Operatoren? Es gilt doch für alle arithmetischen Operatoren Punkt vor Strich?

3. Wie kann ein boolean Wert einen Zustand ändern bzw. wann kann oder sollte man nicht die beiden Seiten eines Gleichheitsoperators vertauschen? (Openbook S, 130)

4. Warum ist println(println()) fehlerhaft? Println benötigt ja keinen Parameter ist den kein Ausdruck nicht gleich einer leeren Klammer?

5. Wie funktionieren geschachtelte Schleifen?
6. Wie funktionieren for-Schleife mit Kommaoperator?
7. Spielen die Rundungsfehler beim Rechnen mit Double keine Rolle? Bzw. sollte man überhaupt mit Gleitkommazahlen rechnen/programmieren?
8. Warum sollte man statt a>=23&&a<=42 a>23&&a<43 schreiben?
9. Was versteht man unter variablen Argumentlisten und warum ermöglichen sie das Methoden belieb viele Argumente zugewiesen werden kann? Versteht man darunter, das durch die Platzhalter Parameter verschiedener Datentypen durch eine Methode ausgegeben werden können?
10. Wann ist ein "Durchfall" bei einem switch Operator sinvoll? Man kann doch die Bedingung im Bedinungskopf bei einer if Anweisung durch logische Operatoren kompakter darstellen?
11. Was versteht man unter: "Wird die for-Schleife zum Durchlaufen einer Variablen genutzt, so heisst der Schleifenzähler Zählvariable oder Laufvariable"?

Und allgemein wie gewöhnt man sich den Umgang und den Einsatz der Verzweigungen und Schleifen an? Ich bin da sehr schwerfällig und bei einer Verschachtelung ist oftmals Schluss.
 
A

Anzeige


Vielleicht hilft dir dieser Kurs hier weiter: (hier klicken)
Dann versuche ich mich erneut an Deinen Fragen.

Erst einmal evtl. wichtig: Vermutlich haben viele hier das Buch "Java ist auch eine Insel" nicht als Buch. Seitenzahlen bringen uns daher nicht wirklich etwas. Evtl. die Stelle online heraus suchen und dann den Link Posten?

1) Wo hast Du das gefunden, dass das Oder einen höheren Rang haben sollte? http://openbook.rheinwerk-verlag.de/javainsel9/javainsel_02_005.htm#mj001aa1d35c1746f2106c8a28aff843e8 besagt genau das Gegenteil. Erst kommt && und dann ||.

2) Binäre Operatoren sind Operatoren, die zwei Operanden haben. Und Du hast hier Funktionsaufrufe. Ehe Java die Operationen angeht, führt Java alle Aufrufe von rechts nach links aus. Kannst Du auch recht einfach testen mit folgender Test.java Datei:

Java:
public class Test {
    public static int a() {
        System.out.println("a");
        return 1;
    }
    
    public static int b() {
        System.out.println("b");
        return 2;
    }
    
    public static int c() {
        System.out.println("c");
        return 3;
    }
    
    public static void main(String[] args) {
        System.out.println(a() + b() * c());
    }
}
Ausgabe ist:
a
b
c
7
Also due Ausführung der Aufrufe erfolgt von Rechts nach Links, Aber die Rückgabewerte selbst werden dann so verwendet, dass erst 2*3 gerechnet wird und dann 1 addiert wird.

3) Diese Frage verstehe ich gerade nicht. Was genau meinst Du? Seite 130 sagt mir jetzt nichts, da mir das Buch nicht vorliegt ....

4) Nein, kein Parameter ist etwas anderes als ein void Parameter (den es in Java nicht gibt). Eine Funktion wie public void test(void a){} funktioniert in java nicht. Die Java Language Specification sieht da eine Variablen Definition vor und void ist da kein gültiger Typ.

5) Geschachtelte Schleifen sind einfach eine Schleife, die im Körper einer anderen Schleife sind. Und wenn nun die äußere Schleife einen Durchgang hat, kommt sie zu der inneren Schleife und dann wird diese so lange durchlaufen, bis diese beendet ist.

6) Komma ist kein Operator sondern ein Separator. So kann man z.B. bei der Definition von Variablen, mehrere in einer Zeile Definieren: int a=1, b=2; Und das kann man auch innerhalb des Kopfes einer For-Schleife nutzen (Sowohl bei der Definition der Schleifenvariablen als auch im 3. Teil in dem die Veränderung durchgeführt werden kann),

7) Rundungsfehler spielen generell immer eine Rolle. Daher muss man sich darüber auch Gedanken machen. Gleitkommazahlen haben eine gewisse Genauigkeit und wenn man etwas berechnet, dann sollte sicher gestellt sein, dass die Genauigkeit ausreichend ist. Aber wenn der Gleitkommazahl-Typ für den benötigten Anwendungsbereich ok ist, dann kann dieser genutzt werden. Es kann Geschwindigkeitsvorteile bringen, wenn man statt mit Gleitkommazahlen mit Ganzen Zahlen rechnet, so dass sich da Überlegungen lohnen können. Beispiel wäre z.B. die Erfassung von Preisen in Cent statt in Euro. Aber wenn man eine Gleitkommazahl in ganzen Zahlen darstellen will, dann kommt man ehh auf eine Darstellung wie sie intern auch benutzt wird....

8) Sollte man das? Im Augenblick sehe ich da keinen wirklichen Grund zu. Generell hat man gewisse Grenzen und man hat selten solche Ausdrücke. Man hat eher etwas wie a <=b und das könnte man umschreiben zu a < b+1 ... Man kann sich jetzt gerne streiten, was besser ist, ich würde zu dem greifen, was ich im Pseudocode gesagt hatte. Also wenn es von Anfang an ein kleiner oder gleich war (Fragestellung: Reicht mein vorhandenes Geld a um Produkt mit Preis b zu kaufen), dann würde ich das klar als <= ausdrücken. Sonst ist die Frage, wieso ich 1 zu dem Preis addiere... Wenn da aber das +1 im Pseudocode schon drin war, dann würde ich dies auch so im Code lassen, damit es lesbar ist und bleibt. (Lesbarkeit ist hier also sehr wichtig in meinen Augen.)

9) Variable Argumentenliste bedeutet, dass (ggf. nach definierten Argumenten) eine beliebige Menge weiterer Argumente eines Typs kommen können. Dies ist dann eigentlich nur eine andere Schreibweise für ein Array.

Also ein public void test (int... x) ist eigentlich nur ein public void test (int[] x). Innerhalb der Funktion greift man jetzt auf ein Array aus int Werten zu. Aber der große Unterschied ist, dass bei letzterem der Compiler einem Arbeit abnimmt und der Code so lesbarer wird:
Bei erster Version kann man die Funktion einfach so aufrufen: test(1,2,3) oder test() oder .... Bei der zweiten Version müsste ich immer ein Array erzeugen. Das kann ein array mit 0 oder mehr Elementen sein, aber ich muss er erzeugen.

Aber wichtig: Die beiden Definitionen von test sind natürlich nicht das gleiche. "ist eigentlich nur" soll also nur die Ähnlichkeit aufzeigen!

10) Sobald bei einem case ein Befehl folgt, sollte mit einem break; nicht mehr durchgefallen werden. Ein Durchfall sollte nur erfolgen, wenn Elemente komplett gleich zu behandeln sind und die Blöcke, bei denen man durchfällt, ganz leer sind.
Aber da muss jeder für sich entscheiden, was er für lesbar hält und was nicht.

11) Da definiert jemand, was er unter "Zählvariable" oder "Laufvariable" verstehen möchte. Die Variable, die in der for() Schleife definiert wird, soll so heissen, vorausgesetzt, da wird etwas durchgezählt.

Hoffe, das war halbwegs verständlich.
 
An was scheitert es?
a) binäre Operationen sollte trivial sein. Unäre, Binäre, Ternäre Operatoren ... Also ein, zwei oder drei Operanden.
b) Reihenfolge der Funktionsaufrufe bei a() + b() * c()
Hier könnte man ja meinen, dass er erst b() und c() aufruft und dann erst a(). Aber dem ist nicht so. Es wird tatsächlich erst a(), dann b() und am ende c() aufgerufen. Die Reihenfolge der Funktionsaufrufe ist somit nicht gleich der Reihenfolge der Operatoren in der Berechnung.
 
Vielen Dank, ich glaube mir sind nun alle Fragen bis auf 1) klar.
Das logische Und hat doch eine Priorität von 10 und das logische Oder eine von 11, müsste da nicht das logische Oder vorher betrachtet werden?
 
Das logische Und hat doch eine Priorität von 10 und das logische Oder eine von 11, müsste da nicht das logische Oder vorher betrachtet werden?
Nein, jeder niedriger die Rangnummer, desto früher wird es ausgeführt. Im normalen Sprachgebrauch hat "Priorität 1" üblicherweise ja auch "höchste" Priorität und "Priorität 2" eine etwas niedrigere. Das ist manchmal vielleicht etwas paradox.
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben