x /= n : Verstehe ich nicht.

nbergmann

Mitglied
int x = 25;
int n = 3;
x /= n;
Könnt ihr mir die 3. Zeile erklären?
Für das nächste Mal:
Wie finde ich die Antwort auf eine derartige Frage in Eclipse oder JShell?
 

Robert Zenz

Bekanntes Mitglied
x/= n ist das gleiche wie x = x /n
Ich bin hier der Pedant und muss sagen dass das so nicht ganz stimmt. Es ist equivalent zu x = (TYPE_X)(x / n). Es inkludiert einen impliziten Cast auf den Ziel-Typ. Das ist ein Detail das man immer im Blick haben sollte. Also:

Java:
int x = 5;

x = x / 5.235; // Compiler-Fehler, "double" passt nicht in "int".
x /= 5.235; // Leise Konvertierung nach "int", entspricht also "x = (int)(x / 5.235)"

Wie finde ich die Antwort auf eine derartige Frage in Eclipse oder JShell?
Gar nicht, aber die offizielle Java Dokumentation ist sehr gut. ... Ich merke gerade die sind gar nicht in der Doku...moment...hier sind sie mit aufgefuehrt, aber ohne weiterfuehrende Erklaerung, habe ich die Doku zu frueh gelobt.
 
Zuletzt bearbeitet:

Blut1Bart

Bekanntes Mitglied

Neumi5694

Top Contributor
Zu dem Thema ist mir gerade ein Gedanke gekommen ... Weiß jemand zufällig, ob "x /=n" in irgend einer Weise optimiert wird, wenn's also um das Laden von Werten, Stackadressen und ähnlichem geht? Oder kommt im Byte-Code genau das gleiche raus?
 

Meniskusschaden

Top Contributor
Oder kommt im Byte-Code genau das gleiche raus?
Für dieses Beispiel:
Java:
package bytecode;

public class Bytecode {

    public static void main(String[] args) {
        m1(8, 2);
        m2(8, 2);
    }

    static int m1(int a, int b) {
        a = a / b;
        return a;
    }
    
    static int m2(int a, int b) {
        a /= b;
        return a;
    }
    
}
wird in meiner Complilerversion für m1() und m2() der gleiche Bytecode erzeugt:
Code:
// Compiled from Bytecode.java (version 16 : 60.0, super bit)
public class bytecode.Bytecode {
 
  // Method descriptor #6 ()V
  // Stack: 1, Locals: 1
  public Bytecode();
    0  aload_0 [this]
    1  invokespecial java.lang.Object() [8]
    4  return
      Line numbers:
        [pc: 0, line: 3]
      Local variable table:
        [pc: 0, pc: 5] local: this index: 0 type: bytecode.Bytecode
 
  // Method descriptor #15 ([Ljava/lang/String;)V
  // Stack: 2, Locals: 1
  public static void main(java.lang.String[] args);
     0  bipush 8
     2  iconst_2
     3  invokestatic bytecode.Bytecode.m1(int, int) : int [16]
     6  pop
     7  bipush 8
     9  iconst_2
    10  invokestatic bytecode.Bytecode.m2(int, int) : int [20]
    13  pop
    14  return
      Line numbers:
        [pc: 0, line: 6]
        [pc: 7, line: 7]
        [pc: 14, line: 8]
      Local variable table:
        [pc: 0, pc: 15] local: args index: 0 type: java.lang.String[]
 
  // Method descriptor #19 (II)I
  // Stack: 2, Locals: 2
  static int m1(int a, int b);
    0  iload_0 [a]
    1  iload_1 [b]
    2  idiv
    3  istore_0 [a]
    4  iload_0 [a]
    5  ireturn
      Line numbers:
        [pc: 0, line: 11]
        [pc: 4, line: 12]
      Local variable table:
        [pc: 0, pc: 6] local: a index: 0 type: int
        [pc: 0, pc: 6] local: b index: 1 type: int
 
  // Method descriptor #19 (II)I
  // Stack: 2, Locals: 2
  static int m2(int a, int b);
    0  iload_0 [a]
    1  iload_1 [b]
    2  idiv
    3  istore_0 [a]
    4  iload_0 [a]
    5  ireturn
      Line numbers:
        [pc: 0, line: 16]
        [pc: 4, line: 17]
      Local variable table:
        [pc: 0, pc: 6] local: a index: 0 type: int
        [pc: 0, pc: 6] local: b index: 1 type: int
}
 

Mart

Top Contributor
static int m1(int a, int b) {
a = a / b;
return a;

a /= b;
return a;
da der einzige unterschied zwischen den Rechnungen der Cast ist wie oben schon beschrieben würd eder im byte code raus kommen normalerweise

ABER da die einzigen zwei werte für die berechnung sowieso den gleichen datentyp haben braucht man NIEMALS den cast, warum sollte ich von int nach int casten? => wird niemals passieren also wirds "wahrscheinlich" optimiert


der cast würde ja dann beim parameter aufruf schon passieren aber diese problematik ist ja beim methoden aufruf und nicht bei der rechnung
 

Blut1Bart

Bekanntes Mitglied
Pardon, wenn es irgendetwas Optimierungswürdiges gäbe, dann stünde es dort... Hier muss man genau sein.

Die Gleitzahldivision ist eindeutig spezifiziert und dass ein Cast in denselben Zieltyp entfallen kann, ist trivial. :)
 

Blut1Bart

Bekanntes Mitglied
Ich sprach von der JLS. Hier wurde erwähnt, dass der Operator gar nicht dokumentiert bzw. spezifiziert sei. Das stimmt so natürlich nicht. Tutorials sind auch etwas anderes als Dokumentationen.

Ich bin immer Fan davon, korrekte Begrifflichkeiten zu verwenden.
 

temi

Top Contributor
Optimierungen wären ja eher Sache des Compilers oder der Runtime, insofern müsste es sich um die Dokumentation eines der beiden handeln und nicht um die Sprachspezifikation. Sollte man meinen.
 

Blut1Bart

Bekanntes Mitglied
Na klar stehen keine Implementierungsdetails in der Spezifikation. Ich habe meine Aussage diesbezüglich ja auch schon konkretisiert: Optimierungsmöglichkeiten können aus der Spezifikation abgeleitet werden.
 

Meniskusschaden

Top Contributor
Optimierungsmöglichkeiten können aus der Spezifikation abgeleitet werden.
Du scheinst dich da ja auszukennen. Wie funktioniert das eigentlich in der Praxis? Man liest die JLS und entdeckt dort eine interessante Funktionalität F. Dann überlegt man sich, dass F ja z.B. mithilfe des inperformanten aber trivialen Algorithmus A_einfaeltig oder auch durch den ausgeklügelten schnellen Algorithmus A_ausgefuchst implementiert sein könnte. Daraus leitet man ab, dass bisher wahrscheinlich alle A_einfaeltig benutzt haben und sich deshalb die Investition in A_ausgefuchst bestimmt lohnen wird. Und so spart man sich die mühsamen Untersuchungen der Implementierungen, um Optimierungspotenzial zu finden, was ja angesichts deren Vielzahl ohnehin ein Wahnsinn wäre. Dass A_ausgefuchst bereits implementiert wurde kann man ja wegen ... na ja, aus irgendwelchen Gründen eben ... ausschließen. Läuft das so ab?
 

kneitzel

Top Contributor
Der Kernpunkt ist doch einfach, dass die Optimierungen so nicht wirklich dokumentiert sind. Zumal es Optimierungen auf vielen Ebenen geben kann:
Java -> Bytecode - so lange die Regeln hier befolgt werden kann ein Compiler machen, was er will.
Bytecode -> Machine Code - so lange es dem JVMS entspricht darf hier eine Implementation frei walten.
'Utility' -> hier ist fast alles offen. Wie z.B. der GC vorgeht ist komplett der Implementation überlassen. Das geht dann bis hin zum 'ich 'abe gar kein Auto GC'
Oft kann man über ein Blick in die Referenzimplementation einige Einsichten gewinnen, aber wie eingeschränkt sich da Dinge ableiten lassen zeigen dann a) Veränderungen über die Zeit b) neue Implementationen (a.la. J9 von IBM/Eclipse Foundation)

Ein Verweis auf Dokumentation ist also extrem anzuzweifeln (Wobei es gute Blog Einträge gibt und so - aber da ist auch immer die Frage: auf was bezieht es sich und ist es noch aktuell bzw auf die Software anzuwenden, die ich gerade nutze?

Und am Ende noch (Last but Not least): es gibt ja auch Lösungen wie GraalVM wo die Struktur wieder etwas anders ist...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Schulaufgabe - verstehe leider die Aufgabe nicht Java Basics - Anfänger-Themen 4
ZH1896ZH Verstehe verschieden Scanner und hasNext() nicht ganz Java Basics - Anfänger-Themen 2
ZH1896ZH OOP Verstehe nicht was der Hinweis bedeutet, bitte um Hilfe! Java Basics - Anfänger-Themen 2
A Hilfe bei Rekursion,Ich verstehe nicht,wie funktioniert die Rekursion in der Methode "walk" Java Basics - Anfänger-Themen 13
A Shopping Cart Programm. Verstehe einige Zusammenhänge nicht Java Basics - Anfänger-Themen 1
K Erste Schritte Ich verstehe das Summenprogramm nicht Java Basics - Anfänger-Themen 10
S Ich verstehe die RegEx Tabelle von Javadoc nicht so ganz Java Basics - Anfänger-Themen 3
V Erste Schritte Array.length[x] in einer Schleife - ich verstehe das nicht Java Basics - Anfänger-Themen 1
Y Erste Schritte Ich verstehe this. nicht so richtig Java Basics - Anfänger-Themen 5
DaCrazyJavaExpert Methoden Verstehe Feheler nicht! Java Basics - Anfänger-Themen 7
Henri ich verstehe gerade nicht die Methode Java Basics - Anfänger-Themen 6
dave253 Ich verstehe folgenden Code nicht.. Java Basics - Anfänger-Themen 12
V Verstehe die Lösung einer Aufgabe von Grunkurs-Java nicht. Java Basics - Anfänger-Themen 11
J Verstehe die NullPointerException nicht Java Basics - Anfänger-Themen 1
J Verstehe meine HashSet Ausgabe nicht Java Basics - Anfänger-Themen 5
P Verstehe Lösung einer Aufgabe von "Grundkurs-Java" nicht Java Basics - Anfänger-Themen 5
O Ich verstehe nicht, was Eclipse von mir will Java Basics - Anfänger-Themen 10
G Methoden Verstehe nicht was in der Methode gemacht wird? Java Basics - Anfänger-Themen 5
M Verstehe das Programm(Quellcode) nicht!! Java Basics - Anfänger-Themen 12
B Verstehe ZufallInt = (int) (Math.random() * 5 + 1); nicht Java Basics - Anfänger-Themen 9
F verstehe diese Variable nicht... Java Basics - Anfänger-Themen 4
A Codezeile die ich nicht verstehe Java Basics - Anfänger-Themen 7
Pentalon Ein Aufruf den ich nicht verstehe Java Basics - Anfänger-Themen 11
V Verstehe die Logik nicht ... Java Basics - Anfänger-Themen 30
C rekursive Methode verstehe nicht! Java Basics - Anfänger-Themen 3
B verstehe methode nicht methode Java Basics - Anfänger-Themen 2
B Erste Schritte Verstehe das nicht Java Basics - Anfänger-Themen 3
C verstehe get und set nicht Java Basics - Anfänger-Themen 3
J Interface Wie funktioniert das mit den Interfaces. Ich verstehe es einfach nicht! :( Java Basics - Anfänger-Themen 15
T ich verstehe array nicht! Java Basics - Anfänger-Themen 11
P for Schleife mit break, verstehe die Ausgabe nicht Java Basics - Anfänger-Themen 6
A Verstehe readLine()-Funktion nicht Java Basics - Anfänger-Themen 3
A Verstehe das GUI nicht! Java Basics - Anfänger-Themen 7
D Verstehe Zusammenhang nicht- Und ihr? Java Basics - Anfänger-Themen 4
M THREADS - Ich verstehe es nicht Java Basics - Anfänger-Themen 10
T Verstehe Bufferreader prinzip nicht Java Basics - Anfänger-Themen 3
M Verstehe Aufgabe nicht, wie kann man schleifen einbauen? Java Basics - Anfänger-Themen 5
N Verstehe Step10 bei jME Eclipsetutorial nicht Java Basics - Anfänger-Themen 4
L Verstehe den Wert nicht! If-Anweisung Java Basics - Anfänger-Themen 5
N Verstehe diese Aufgabe nicht! Java Basics - Anfänger-Themen 16
Rudolf Verstehe das Ergebnis nicht - bitte erklären Java Basics - Anfänger-Themen 7
S Finde den Fehler nicht/ verstehe Anweisung nicht Java Basics - Anfänger-Themen 12
K Ich verstehe switch einfach nicht Java Basics - Anfänger-Themen 4
C Verstehe Code-Teil nicht. Java Basics - Anfänger-Themen 2
S Ich verstehe diese Methode nicht! Java Basics - Anfänger-Themen 6
G Verstehe das nicht. bitte um hilfe Java Basics - Anfänger-Themen 13
R Thread startet nicht, verstehe nicht warum Java Basics - Anfänger-Themen 2
R Verstehe die Ausgabe von folgendem Code nicht Java Basics - Anfänger-Themen 4
A verstehe aufgabenstellung nicht! Java Basics - Anfänger-Themen 47
S verstehe den fehler nicht Java Basics - Anfänger-Themen 14
C Verstehe die Syntax nicht! Java Basics - Anfänger-Themen 2
M Verstehe den Quellcode nicht ganz Java Basics - Anfänger-Themen 3
7 Verstehe Programm nicht Java Basics - Anfänger-Themen 6
G verstehe das problem nicht :( Java Basics - Anfänger-Themen 4
S RegEx Syntax - ich verstehe sie einfach nicht! Java Basics - Anfänger-Themen 3
G verstehe den unterschied zwischen equals und == nicht Java Basics - Anfänger-Themen 3
E Verstehe eine Schleife nicht Java Basics - Anfänger-Themen 5
B Eine Linie zeichnenmit Java, ich verstehe das einfach nicht Java Basics - Anfänger-Themen 4
G Verstehe einen Aufruf absolut nicht Java Basics - Anfänger-Themen 2
T Brauche Hilfe um ein Programm zu verstehe Java Basics - Anfänger-Themen 4
J Rekursiver Horner-Schema-Algorithmus - Verstehe ich ihn richtig? Java Basics - Anfänger-Themen 2
E I-JVM verstehe ich das richtig (bytecode aufgabe) Java Basics - Anfänger-Themen 2
M Mein quellcode wird nicht in der Konsole ausgegeben Java Basics - Anfänger-Themen 3
J Datentypen String in File konvertieren funktioniert nicht Java Basics - Anfänger-Themen 4
D Rekursion - Ich raffs nicht Java Basics - Anfänger-Themen 16
E Pervasive PSQL insert funktion geht nicht Java Basics - Anfänger-Themen 8
L while Schleife mit 2 Bedingung endet nicht Java Basics - Anfänger-Themen 3
U Warum kann ich die Methode in der ENUM Klasse nicht aufrufen? Und warum geht die Switch nicht? Java Basics - Anfänger-Themen 8
berserkerdq2 Wie würde man einen regulären Ausdruck in Java schreiben, der prüft, dass zwei bestimtme Zahlen nicht nebeneinadner sind? Java Basics - Anfänger-Themen 3
U Warum kriege ich hier eine nullpointer exception, sehe den Fehler nicht (swing) Java Basics - Anfänger-Themen 1
I Code wird nicht ausgeführt Java Basics - Anfänger-Themen 2
M wird der Konstruktor nicht als 1. ausgeführt? Java Basics - Anfänger-Themen 13
stormyark 4 Bit in einer for-schleife funktioniert nicht Java Basics - Anfänger-Themen 3
G jButton führt Main Methode nicht richtig aus Java Basics - Anfänger-Themen 3
G Main Methode wird beim ersten Aufruf nicht richtig ausgeführt Java Basics - Anfänger-Themen 1
M Nicht genug Eingabemöglichkeiten in der Konsole Java Basics - Anfänger-Themen 5
E Select nimmt nicht alle Where /AND befehlen an Java Basics - Anfänger-Themen 4
C60 Methoden Main-Methode erkennt meine Arrays nicht. Java Basics - Anfänger-Themen 7
E Mysql Update wenn es nicht existiert insert Java Basics - Anfänger-Themen 14
C SFTP Verbindung nicht möglich Java Basics - Anfänger-Themen 4
K Warum ist die binäre Suche bei der verketteten Liste nicht so effektiv? Java Basics - Anfänger-Themen 3
O Warum bekommen wir nicht die Referenz vom zurückgegebenen Objekt? Java Basics - Anfänger-Themen 4
M Wie kann ich festlegen, dass ein Attribut maximal den Wert 0 erreicht, also nicht in den negativen Bereich fällt? Java Basics - Anfänger-Themen 4
I Programm erkennt nicht an das Array zurückgegeben wird trotz Initialisierung *einfach* Java Basics - Anfänger-Themen 9
J Nach dem Exportieren funktioniert mein Programm nicht mehr Java Basics - Anfänger-Themen 8
B Methoden Rekursiv festellen, ob eine Zahl gerade-oft vorkommt oder nicht Java Basics - Anfänger-Themen 4
K Jlabel mit itemlistevent Text gegeben, wird nicht angezeigt Java Basics - Anfänger-Themen 5
P Mein Programm wird zwar erfolgreich Compiliert, öffnet sich aber nicht Java Basics - Anfänger-Themen 6
M Java printf(Locale.... funktioniert nicht Java Basics - Anfänger-Themen 3
X Wie erreiche ich, dass ein Robot weitere Attribute hat, die nicht materialisiert sind, sondern nur über get/ set-Methoden simuliert sind? Java Basics - Anfänger-Themen 1
M Wie können Klassen nicht-materialisierte Attribute haben, die nur über get/ set-Mehoden simuliert sind? Java Basics - Anfänger-Themen 6
N Wieso funktioniert die Deklaration nicht Java Basics - Anfänger-Themen 3
B Scrollbares Fenster (JScrollPane) mit JPanel scrollt nicht Java Basics - Anfänger-Themen 3
O System.out.println wird nicht ausgegeben? Java Basics - Anfänger-Themen 11
O Regex bei ReplaceAll ersetzt Wort und Sonderzeichen nicht. Java Basics - Anfänger-Themen 9
E JFreeChart (LineChart) akutalisiert nicht Java Basics - Anfänger-Themen 10
tun3d Packet trotz richtiger Addressierung nicht auffindbar? Java Basics - Anfänger-Themen 10
R UML-Bild (Erkennung ob static o. nicht) Java Basics - Anfänger-Themen 18
nbergmann Umgebungsvariablen einstellen unter Windows 7 klappt nicht Java Basics - Anfänger-Themen 2
J Interpreter-Fehler Programm gibt nicht gewünschtes Ergebnis aus Java Basics - Anfänger-Themen 11

Ähnliche Java Themen


Oben