Extrem einfache Aufgabe falsch beantwortet :$

coco07

Bekanntes Mitglied
Hey liebe Community,

heute Morgen als ich mit meinem Java Buch weitergearbeitet habe, kam eine extrem aussehende Aufgabe auf mich zu:

Java:
public class Main {
	public static void main(String args[]){
		
		int x = 99;
		int y = 10;

		y = x++ ;

		System.out.println("x: " + x + "  y: " + y );
	}
}

Wie ich denke:

Java:
public class Main {
	public static void main(String args[]){
		
		int x = 99; 
		int y = 10;

		y = x++ ; // y den Wert von x + 1 zuweisen! Wäre dann 100

		System.out.println("x: " + x + "  y: " + y );
	}
}

Ausgabe ist x=100, y=99 :roll: :roll: :roll:

Wieso wird denn hier x um 1 erhöht und mit y passiert gar nichts? Ich dachte immer "=" ist ein Zuweisungsoperator? Also müsste doch was mit y passieren und mit x gar nichts !?

Bitte um Hilfe :(

grüße coco07
 

rme

Top Contributor
Hallo :)

[c]x++[/c] ist gleichzeit eine Anweisung und ein Ausdruck. Die Anweisung lautet: Erhöhe x. Der Wert des Ausdrucks ist aber der alte Wert von x - wenn das ++ hinter dem x steht, wird erst der Ausdruck ausgewertet (x) und dann die Anweisung ausgeführt (x erhöhen).

Andersrum geht es auch: [c]++x[/c] führt erst die Anweisung aus (x erhöhen) und gibt dann den Wert des Ausdrucks (x + 1) zurück.

Hilft das? :)
 
Zuletzt bearbeitet:

coco07

Bekanntes Mitglied
Ich konnte mir schon denken, was das bedeutet, aber den Sinn dahinter verstehe ich nicht.
Ich dachte immer, "=" wäre nur eine Zuweisung, dass sich dahinter noch eine Anweisung verstecken konnte, wusste ich nicht.

Vielen Dank rme!


grüße coco07
 

rme

Top Contributor
Du hast Recht, dass = nur eine Zuweisung ist. Aber: Auf rechten Seite des = steht immer ein Ausdruck, der vor der Zuweisung ausgewertet wird. Du kannst ja auch schreiben: [c]a = b + 2[/c]. Dann wird zuerst die rechte Seite berechnet, bevor die Zuweisung ausgeführt wird. Der Ausdruck lautet hier "b + 2".

Nun ist [c]x++[/c] eben eine Besonderheit, weil es neben einem Ausdruck auch eine Anweisung ist. Das steht ja eigentlich für [c]x = x + 1[/c]. Es hat also einen Effekt, weshalb es eine Anweisung ist - aber auch einen Wert, weshalb es ein Ausdruck ist.

Wozu man das braucht? Nun, manchmal hat man eine Schleife, in der etwas berechnet werden soll und sich gleichzeitig ein Zähler erhöhen soll:
Java:
int fakul = 1;
int wert = 0;
do {
  fakul = fakul * wert++;
} while(fakul <= 120);

In dieser Schleife wird die Variable fakul mit der Variable Wert multipliziert, gleichzeitig soll aber wert dabei erhöht werden. Doof ist jetzt, dass wert bei 0 anfängt, deshalb wird fakul in der ersten Iteration der Schleife 0, weil wert++ ja zu 0 auswertet. An dieser Stelle müsste man dann ++wert schreiben, damit es klappt.

Zugegebenermaßen selten, dass man das braucht - eigentlich ist es ein Relikt aus der Programmiersprache C, auf der die Syntax von Java basiert. Da braucht man es für Operationen auf Zeigern tatsächlich oft.
 
Zuletzt bearbeitet:

ARadauer

Top Contributor
Im Grunde in kleines Detail dass den Unterschied zwischen Post/Pre Increment lernen soll. Meiner Meinung nach ein Blödsinn, was man im realen Berufsleben sie nicht braucht. Ich programmiere seit 10 Jahren und den Unterschied zwischen x++ und ++x braucht kein Mensch.
Ich würde nie y = x++ ; schreiben sondern immer
x++;
y = x;
bzw wenn der wert vor dem erhöhen gewünscht ist, was eigentlich der ausdruck macht, dann
y = x;
x++;
 

coco07

Bekanntes Mitglied
rme@ Vielen Dank rme, habe den Unterschied nun verstanden, frage mich trotzdem, warum nicht erst der ganze Ausdruck bzw. die ganze Anweisung errechnet wird und nicht erst dann y zugewiesen wird, aber ist ja erst einmal unwichtig.

Liebe Grüße coco07

ARadauer@ Vielen Dank auch für deine Antwort ARadauer, beruhigend ist das natürlich, trotzdem sollte man warscheinlich wissen, was der Unterschied ist, weil jeder Programmierer anders programmiert und evtl. mein Team später genauso programmiert, sollte ich eins haben. Auch wirkt sich x++ auch auf die Ersparnisse im Code aus, was für mich persönlich eine sehr wichtige Rolle spielt :)

Liebe Grüße coco07
 
Zuletzt bearbeitet:

rme

Top Contributor
Der Grund, warum der Ausdruck erst ausgewertet wird, bevor die Anweisung ausgeführt wird, liegt einfach daran, dass man absichtlich so einen sonderbaren Befehl erstellen konnte, der in einigen Aufgaben eben eine einzelne Zeile spart.
Das stammt aus Zeiten, in denen man noch via Terminal programmiert hat, Festplatten sehr klein waren und man allgemein überall Platz sparen wollte.

Heute haben wir genug Speicher, um unserer Programme leserlich zu schreiben. Ich würde daher nur selten Code schreiben, der die Semantik von [c]x++[/c] tatsächlich nutzt, d.h. den Ausdruck braucht, statt nur den Effekt der Anweisung zu wollen. Ich komme nochmal darauf zurück, weil du gerade geschrieben hast, dass du gern Code einsparst - das ist in vielen Fällen keine gute Idee! Der Code wird nicht langsamer, wenn du statt [c]x++;[/c] sowas wie [c]x = x + 1;[/c] schreibst. Der Compiler erzeugt sogar exakt den gleichen Code für beide Fälle. In der Praxis ist es viel wichtiger, den Code möglichst leserlich zu schreiben, damit andere Leute aus dem Team ihn auch Anhieb verstehen und sich nicht erst an alle Feinheiten der Semantik erinnern müssen, um ihn lesen zu können. Spätestens, wenn du mal deinen eigenen Code aus einem Projekt bearbeiten musst, das du seit Jahren nicht mehr angefasst hast, wirst du dich freuen, wenn du ihn sofort wieder verstehst.

Also: Lieber ausführlich und leserlich schreiben, sonst spart man an der falschen Stelle. Bei einem [c]x++[/c] finde ich das allerdings noch OK, bei intensiver Anwendung des ?:-Operators hört's irgendwann auf.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Simpler Algorithmus läuft extrem langsam. Java Basics - Anfänger-Themen 3
1 Extrem große Variable Java Basics - Anfänger-Themen 1
M Input/Output Arbeiten mit extrem vielen Dateien Java Basics - Anfänger-Themen 8
P Datentypen extrem viele Fehler nur irgendwie seh ich den Grund ned... Java Basics - Anfänger-Themen 3
D extrem noob komplett neuanfang mit java Java Basics - Anfänger-Themen 5
monsterherz einfache Methode mit Fehler den ich nicht finde Java Basics - Anfänger-Themen 21
I Erste Schritte Einfache Datenbank-Webseite erstellen als Nicht-IT-lerin Java Basics - Anfänger-Themen 24
B Einfache OCR zur Zahlenerkennung? Java Basics - Anfänger-Themen 6
M Einfache Datenfilterung Java Basics - Anfänger-Themen 15
D Beim Programmieren auf die Logisch einfache Lösung kommen. Java Basics - Anfänger-Themen 17
H Einfache Frage zur Punktnotation objektname.methode(wert) Java Basics - Anfänger-Themen 2
B Einfache HSQLDB? (lock acquisition failure) Java Basics - Anfänger-Themen 2
B Threads Thread sleep() Method einfache Frage Java Basics - Anfänger-Themen 8
O Ganz einfache Frage - Array Java Basics - Anfänger-Themen 5
E Einfache Java Verschlüsselung Java Basics - Anfänger-Themen 4
J Einfache Frage zu "null" Java Basics - Anfänger-Themen 2
J Einfache pub/sub Lösung mit ausführlicher Doku Java Basics - Anfänger-Themen 5
R Gibt es Eine einfache Programierung dieser Methoden Java Basics - Anfänger-Themen 8
K einfache Kombinatorik Java Basics - Anfänger-Themen 4
M Erste Schritte Einfache Aufzugssteuerung programmieren - Anfänger Java Basics - Anfänger-Themen 2
D Eine einfache Verschlüsselung schreiben Java Basics - Anfänger-Themen 3
B in einem abstrakten Set ,Elemente einer einfache verkettete List epeichern Java Basics - Anfänger-Themen 13
X Einfache Frage; wie soll ich die spezielle float var speichern? Java Basics - Anfänger-Themen 2
J Einfache einbindung eines Bildes in ein Applet Java Basics - Anfänger-Themen 4
D Klassen Gesucht: Einfache Beispiel-Klasse für einen Datentyp Java Basics - Anfänger-Themen 7
K Möglichkeiten um eine einfache Animation darzustellen Java Basics - Anfänger-Themen 7
L Einfache Lineare Suche Java Basics - Anfänger-Themen 7
P Erste Schritte Einfache For Schleife Java Basics - Anfänger-Themen 10
M Einfache Java Operation, cheggs net Java Basics - Anfänger-Themen 2
V Erste Schritte Einfache Rechnung mit Exponenten Java Basics - Anfänger-Themen 3
G einfache Leet-Übersetzung implementieren und benutzen Java Basics - Anfänger-Themen 14
M Einfache und Doppelte Operatoren Java Basics - Anfänger-Themen 3
E Einfache For-Schleife macht nicht was sie soll Java Basics - Anfänger-Themen 2
shiroX OOP Türme von Hanoi - einfache grafische Ausgabe Java Basics - Anfänger-Themen 2
Z Super einfache Frage For-Schleife im Detail Java Basics - Anfänger-Themen 3
N Potenzierung durch einfache Operatoren Java Basics - Anfänger-Themen 13
H Einfacher Editor, Einfache Handelsanweisungen Java Basics - Anfänger-Themen 2
H Sehr einfache Java-Programme Java Basics - Anfänger-Themen 24
H Einfache Client/Server-Kommunikation Java Basics - Anfänger-Themen 16
-horn- Einfache graphische Darstellung von 3D Koordinaten für Flugbahnen? Java Basics - Anfänger-Themen 4
B Einfache jsp Seite darstellen Java Basics - Anfänger-Themen 9
G Einfache if-Abfrage der Main-Argumente Java Basics - Anfänger-Themen 3
J Einfache Designfrage Java Basics - Anfänger-Themen 4
R Methoden Einfache Loops? Java Basics - Anfänger-Themen 8
E einfache Frage zu private Java Basics - Anfänger-Themen 26
R Sehr einfache möglichkeit ArrayList oder Array zu initialisieren? Java Basics - Anfänger-Themen 8
F Einfache Klassen für Datum und Zeit Java Basics - Anfänger-Themen 3
Spin Einfache Anfänger Frage setVisible von Panels Java Basics - Anfänger-Themen 5
E OOP einfache Array Aufgabe mit jUnit Java Basics - Anfänger-Themen 5
D einfache Quizfrage programmieren Java Basics - Anfänger-Themen 11
B Einfache Applets für Webseite Java Basics - Anfänger-Themen 10
K Einfache Rekursion - Wert wird nicht in Variable gespeichert Java Basics - Anfänger-Themen 7
U Einfache Aufgabe Java Basics - Anfänger-Themen 5
E Einfache Frage zur Parameterübergabe in Methoden Java Basics - Anfänger-Themen 8
M einfache Übungsaufgaben gesucht Java Basics - Anfänger-Themen 7
M Einfache Rechnung(R=U/I) Java Basics - Anfänger-Themen 12
D Wohl eine einfache Frage... Java Basics - Anfänger-Themen 2
W Einfache Passwortabfrage funktioniert nicht Java Basics - Anfänger-Themen 3
P einfache GUI-Elemente Java Basics - Anfänger-Themen 10
F Vererbung (einfache Frage) Java Basics - Anfänger-Themen 5
S 2 Einfache Fragen (Exception Breakpoint, Konstruktor) Java Basics - Anfänger-Themen 4
L einfache Klasse erstellen Java Basics - Anfänger-Themen 16
M kleine und einfache Verständnisfrage Java Basics - Anfänger-Themen 3
P Einfache Bedingung (?) in Java Java Basics - Anfänger-Themen 3
W Einfache Rekursion Java Basics - Anfänger-Themen 14
T Einfache Textausgabe .java unter OS X Java Basics - Anfänger-Themen 13
B einfache Rekursion Java Basics - Anfänger-Themen 9
A [Hilfe] einfache Aufgabe Java Basics - Anfänger-Themen 26
A Einfache java Verschlüsselung HILFE Java Basics - Anfänger-Themen 3
M einfache java application Java Basics - Anfänger-Themen 4
S Kann einfache Texteingabe nicht auswerten! Java Basics - Anfänger-Themen 3
M einfache frage zum Jdk-Compiler Java Basics - Anfänger-Themen 3
Spin einfache Frage zu Klassen Java Basics - Anfänger-Themen 12
J einfache Tastendrücke in einem JFrame abfragen Java Basics - Anfänger-Themen 2
C "einfache" If-Abfrage Java Basics - Anfänger-Themen 15
H Einfache Ausgabe eines Arrays in einen File Java Basics - Anfänger-Themen 8
F Einfache Liste hinten was einfügen Java Basics - Anfänger-Themen 3
L Einfache Umrechnung Java Basics - Anfänger-Themen 2
D Einfache Funktion zum kaufmännischen runden Java Basics - Anfänger-Themen 8
K einfache Multiplikation Java Basics - Anfänger-Themen 6
S Einfache Rechnung mit Schleife Java Basics - Anfänger-Themen 10
G einfache Swing-GUI Java Basics - Anfänger-Themen 3
F Einfache Tastatureingabe Java Basics - Anfänger-Themen 2
L [gelöst] Einfache Aufgabe, läuft aber nicht. Java Basics - Anfänger-Themen 8
S "einfache Klassengeschichten" keine Fehler, läuft Java Basics - Anfänger-Themen 2
R Einfache MVC-Uhr. MVC richtig umgesetzt? [Überarbeitet] Java Basics - Anfänger-Themen 5
A Einfache Frage zur Mehrfachvererbung Java Basics - Anfänger-Themen 3
G Einfache Berechnung liefert falsches Ergebnis Java Basics - Anfänger-Themen 2
J eine einfache liste Java Basics - Anfänger-Themen 17
D Suche einfache Übungsaufgaben für den JavaCreator! Java Basics - Anfänger-Themen 5
R Einfache Messagebox Java Basics - Anfänger-Themen 9
N einfache Adressdatenbank in Textdatei Java Basics - Anfänger-Themen 8
I einfache Wiedergabe Java Basics - Anfänger-Themen 2
B Warum hat dieser einfache Algorithmus lineare Laufzeit? Java Basics - Anfänger-Themen 3
U "Einfache Verschlüsselung" Java Basics - Anfänger-Themen 17
K einfache Umfang und Flächenberechnung mit interfaces Java Basics - Anfänger-Themen 3
M Einfache HTML Mail versenden , suche Beispiel Java Basics - Anfänger-Themen 5
L MVC-einfache frage Java Basics - Anfänger-Themen 13
M einfache schleife Java Basics - Anfänger-Themen 7
M Einfache Schleife Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben