Results 1 to 9 of 9

Java - Literals

  1. #1 Reply With Quote
    Waldläufer
    Join Date
    May 2017
    Posts
    142
    Ich habe das Konzept von `Literals` in Java bisher nicht verstanden.

    Bsp.:
    "Literals provide a means of expressing specific values in your program. For example, in the following statement, an integer variable named count is declared and assigned an integer value. The literal 0 represents, naturally enough, the value zero.

    Numeric literal.
    int count = 0;
    "


    Ich verstehe nicht, wozu darauf hingewiesen wird, dass die 0 für den Wert Null steht
    und dass es dafür einen Begriff "Literal" gibt.

    ebenso Boolean Literal:
    "There are two boolean literals


    • true represents a true boolean value
    • false represents a false boolean value"


    Wozu wird das "Literal" genannt?
    Es ist doch klar, dass Worte und Zeichen und Nummern eine Bedeutung haben?
    Lordkaiser is offline

  2. #2 Reply With Quote
    Ritter
    Join Date
    Feb 2003
    Posts
    1,552
    Ein Literal ist ein Wert, der direkt im Quellcode repräsentiert wird.
    Beispiel:
    Code:
    String s = "Hallo Welt";
    Hier ist "Hallo Welt" ein Literal. In diesem Fall ist der Literal eine Initialisierung einer Variable. Ein anderes Beispiel wäre z.B.
    Code:
    "Hallo Welt".contains(s);
    In diesem Fall ist "Hallo Welt" eine sog. literale Konstante.

    Ich hoffe, das wird ein wenig klarer.
    Whiz-zarD is offline

  3. #3 Reply With Quote
    Waldläufer
    Join Date
    May 2017
    Posts
    142
    Quote Originally Posted by Whiz-zarD View Post
    Ich hoffe, das wird ein wenig klarer.
    Kein bisschen. :P

    Wenn bei der Initialisierung
    "String s = "Hallo Welt"; "
    der Name der Variable ein Literal ist,
    dann müsste ja jede Variable immer ein Literal sein, sobald sie einen Namen hat, also jede?

    Was ist denn ein Beispiel für einen Wert, der NICHT direkt im Quellcode repräsentiert und damit NICHT ein Literal ist?
    Lordkaiser is offline

  4. #4 Reply With Quote
    Schwertmeister
    Join Date
    Jul 2017
    Posts
    923
    Quote Originally Posted by Lordkaiser View Post
    Kein bisschen. :P

    Wenn bei der Initialisierung
    "String s = "Hallo Welt"; "
    der Name der Variable ein Literal ist,
    dann müsste ja jede Variable immer ein Literal sein, sobald sie einen Namen hat, also jede?

    Was ist denn ein Beispiel für einen Wert, der NICHT direkt im Quellcode repräsentiert und damit NICHT ein Literal ist?
    Nein, nicht s, sondern "Hallo Welt"

    a=0; //0 ist literal
    b=1; //1 ist literal
    a=b; //a=1 und nicht literal
    Stiller Leser is offline

  5. #5 Reply With Quote
    Waldläufer
    Join Date
    May 2017
    Posts
    142
    achsoo, ein Literal ist ein Wert, der durch etwas anderes im Code repräsentiert wird! (richtig?)


    Also zu diesem Beispiel
    Bsp.:
    "Literals provide a means of expressing specific values in your program. For example, in the following statement, an integer variable named count is declared and assigned an integer value. The literal 0 represents, naturally enough, the value zero.

    Numeric literal.
    int count = 0;
    "

    Der Text "The literal 0 represents, naturally enough, the value zero." hatte mich verwirrt.
    Es ist weniger, dass das Literal die Null "repräsentiert", sondern vielmehr, dass die Variable `count` das Literal "0" repräsentiert.
    (richtig?)
    Lordkaiser is offline Last edited by Lordkaiser; 11.09.2018 at 15:38.

  6. #6 Reply With Quote
    Forschungsreisender  jabu's Avatar
    Join Date
    Jul 2011
    Posts
    4,741
    Vielleicht hilft das, um der Sache auf die Schliche zu kommen:
    Versuche, einfacher (sturer) zu denken.
    Versuche, Literal duch ein Stück dummer Quelltext zu ersetzen.
    Versuche, repräsentieren durch symbolisieren, ausdrücken oder stehen für zu ersetzen.

    Quote Originally Posted by Lordkaiser View Post
    achsoo, ein Literal ist ein Wert, der durch etwas anderes im Code repräsentiert wird! (richtig?)
    Nein, anders (trenne dich von "Code" (zu allgemein), unterscheide Quelltext von Programmcode):
    Ein Literal ist kein Wert, sondern es repräsentiert im Quelltext (nicht im Programmcode) einen Wert. Mit dem Wert kann der Compiler etwas anfangen. Er kann z.B. diesen Wert an eine Variable zuweisen. An den Wert kann nichts zugewiesen werden.

    Weil man in diesem Zusammenhang manchmal über den Begriff der Konstante stolpert:
    Ein Literal ist keine echte Konstante (und schon gar keine konstante Variable), sondern lediglich eine symbolische Konstante. Das ist keine Spitzfindigkeit. Solange du den Eindruck hast, dass das spitzfindig wäre, hast du die Sache noch nicht durchdrungen. Andernfalls könntest du auf einem guten Weg sein. Nimm das als Prüfstein.

    Also zu diesem Beispiel
    Bsp.:
    "Literals provide a means of expressing specific values in your program. For example, in the following statement, an integer variable named count is declared and assigned an integer value. The literal 0 represents, naturally enough, the value zero.

    Numeric literal.
    int count = 0;
    "

    Der Text "The literal 0 represents, naturally enough, the value zero." hatte mich verwirrt.
    Es ist weniger, dass das Literal die Null "repräsentiert", sondern vielmehr, dass die Variable `count` das Literal "0" repräsentiert.
    (richtig?)
    Nein, du hast das leider verdreht.

    Es ist eben doch so, dass das Literal 0 (wie es im Text steht) den Wert 0 repräsentiert und dass die Variable count mit diesem Wert (nicht mit dem Literal, sondern mit dem Wert, den das Literal repräsentiert) initialisiert wird.

    count ist eine Variable, kein Literal. Variablen stehen nicht für Literale und speichern auch keine, sondern sie speichern jeweils einen Wert des angegebenen Typs (bei Objekten eine Referenz). Literale existieren im Quelltext, nicht im ausführbaren Programm (s.o.). Sie werden vom Compiler ausgewertet.

    Kurz:
    Die Variable count wird mit dem Wert 0 initialisiert, welchen das Literal 0 (was, vereinfacht gesagt, ein Stück Quelltext ist) repräsentiert.

    Der Compiler liest also das Literal, deutet daraus den Wert, den es repräsentiert (dann kann er das Literal wegschmeißen) und sorgt beim Erstellen dafür, dass die Variable den zugewiesenen Wert rechtzeitig haben wird, also spätestens, wenn er zur Laufzeit gebraucht wird (nach den Vorgaben, die die Sprache macht, z.B. über die Initialisierungsreihenfolge, was aber durch Optimierungen geändert werden kann, wenn das Ergebnis gleichwertig ist).
    jabu is offline

  7. #7 Reply With Quote
    Waldläufer
    Join Date
    May 2017
    Posts
    142
    Ich kapier's noch nicht.

    Ein Literal ist das, was ich sehe ("0"),
    es repräsentiert einen Wert, den ich aber nicht sehe (ebenfalls Null),
    aber der Compiler benutzt ersteres um letzteres zu finden?

    Könnt ihr mir vielleicht ein paar logische Aussagen (Beispiele) nennen,
    in denen es relevant ist, ein Literal zu erkennen?

    wie soll ich fragen..
    Wann ist es denn z.B. relevant zu wissen, dass die "0", die da steht, ein Literal ist?
    Lordkaiser is offline

  8. #8 Reply With Quote
    Ritter
    Join Date
    Feb 2003
    Posts
    1,552
    Du denkst einfach viel zu kompliziert.
    Wie gesagt, ein Literal ist nichts weiter, als ein fester Wert im Code. Nicht mehr.

    Ist zwar jetzt C# aber im IL Code wird vielleicht etwas deutlich, was mit den Literalen passieren.

    C#-Code:
    Code:
    var b = "Hallo Welt";
    var c = b.Contains("H");
    var d = 2;
    IL Code (Der Code, den der Compiler generiert; In der Java-Welt nennt man ihn Bytecode):
    Code:
    IL_0008: ldstr        "Hallo Welt"
    IL_000d: stloc.0      // b
    
    IL_000e: ldloc.0      // b
    IL_000f: ldstr        "H"
    IL_0014: callvirt     instance bool [mscorlib]System.String::Contains(string)
    IL_0019: stloc.1      // c
    
    IL_001a: ldc.i4.2     
    IL_001b: stloc.2      // d
    Im IL Code sieht man nun folgenden Befehl:
    Code:
    ldstr        "Hallo Welt"
    "ldstr" steht für "load string". Also es wird der String "Hallo Welt" in den Speicher geladen und dann mit "stloc" in die lokale Variable 0 (was im unseren Code b ist) gespeichert.

    Im zweiten Block wird die lokale Variable 0 und wieder mittels "ldstr" den String "H" geladen und dann wird Contains() aufgerufen und das Ergebnis von Contains() in die lokale Variable 1 (unser c) zugeordnet.

    Mit "ldc.i4.2" wird der Integer-Wert von 2 geladen und mit "stloc.2" der lokalen Variable 2 zugeordnet.

    "Hallo Welt", "H", und die 2 sind hierbei Literale. Sie stehen also direkt im Code und im kompilierten Code stehen sie auch direkt so drinnen. Bei einer Variablendeklaration, wie z.B. bei den Variablen b und d, wird der Wert in den Speicher geladen und dann der jeweiligen Variable zuordnet.

    Literale erkennst du also immer, dass der Wert direkt im Code steht. Wie gesagt, mehr ist das einfach nicht. Auch wenn du schreibst:
    Code:
    if(c == false)
    {
        // ...
    }
    ist false ein Literal. Der IL Code ist dann folgender:

    Code:
    IL_001e: ldloc.1      // c
    IL_001f: ldc.i4.0     
    IL_0020: ceq          
    IL_0022: stloc.s      V_4
    Es wird zuerst c geladen, dann wird der Integer-Wert von 0 geladen. Beide Werte werden miteinander verglichen und das Ergebnis einer Variable zuordnet. Wieso ein Integer-Wert von 0, obwohl wir doch ein Boolean angegeben haben? Weil Boolean intern als Integer abgebildet werden. 0 für false und 1 für true. Der Befehl "ceq" vergleicht beide Werte.

    Wie man sieht, ist das kein Hexenwerk, sondern einfach nur ein Wert im Code. Egal wo und wann. Siehst du ein Wert direkt im Code, ist es ein Literal.
    Whiz-zarD is offline Last edited by Whiz-zarD; 12.09.2018 at 21:53.

  9. #9 Reply With Quote
    Forschungsreisender  jabu's Avatar
    Join Date
    Jul 2011
    Posts
    4,741
    Quote Originally Posted by Lordkaiser View Post
    Ich kapier's noch nicht.
    Du bist jetzt aber dicht dran.

    Und denke bitte, wie gesagt, ganz stur. Ein Literal ist weder eine Variable noch etwas von besonderem akademischen Nährwert, sondern einfach ein Quelltextbestandteil (natürlich auf der Ebene seiner Bedeutung, nicht der seiner Zeichenkodierung), aber nicht irgendeiner, sondern einer, der einen Wert repräsentiert.

    Ein Literal ist das, was ich sehe ("0"),
    Richtig, und was der Compiler sieht.

    es repräsentiert einen Wert, den ich aber nicht sehe (ebenfalls Null),
    Richtig, du interpretierst den Wert aus dem Literal, und der Compiler interpretiert den Wert aus dem Literal.

    Zudem symbolisiert das Literal auch den Typ des Wertes. So ist eine ganzzahlige Ziffer ohne weitere Angaben vom Typ int, während 0L vom Typ long ist.

    aber der Compiler benutzt ersteres um letzteres zu finden?
    Jain (kann missdeutig sein). Es ist ziemlich einfach (wie gesagt, stur denken):
    Es gibt nichts mehr zu finden, nachdem der Compiler das Literal interpretiert hat. Wert und Typ stehen also fest. Der Compiler verwendet Wert und Typ symbolisch, weswegen er das Literal wegschmeißen kann (wie ich sagte). Es gibt keinen Grund dafür, im Nachhinein etwas zu finden. Nachdem der Ausdruck ausgewertet wurde, existiert auch der Wert nicht mehr (bei der Ausführung, also von irgendeinem Zwischencode mal abgesehen):
    Code:
    // Das Literal 0L repräsentiert den Wert 0 vom Typ long.
    // sobald der Compiler das^ weiß, ist das Literal irrelevant (es existiert nicht im Programm)!
    // Der Compiler baut das Programm so zusammen,
    // dass die Variable count (ebenfalls vom Typ long) mit diesem^ Wert initialisiert wird:  
    long count = 0L;
    // Nach der Initialisierung der Variablen ist der Wert, der zugewiesen wurde, irrelevant!
    // Er kann im Programm existieren, muss aber nicht immer (kommt auf den Einzelfall an).
    // In jedem Fall ist seine Lebensdauer kurz (auf den aktuellen Ausdruck beschränkt).
    // Nur noch die Variable ist relevant:
    count++;
    count++;
    // Auch 1L ist ein Literal.
    // count wird mit dem Wert verglichen, den das (bereits vom Compiler verworfene) Literal 1L repräsentiert,
    // und sofort nach dem Vergleich kann (und wird normalerweise) wiederum der Wert verworfen,
    // denn es kann gar nicht mehr auf ihn Bezug genommen werden (wie oben).
    if (count > 1L) {
        //tu was
    }
    Könnt ihr mir vielleicht ein paar logische Aussagen (Beispiele) nennen,
    in denen es relevant ist, ein Literal zu erkennen?
    Siehe Wikipedia, siehe hier. Wenn du Literale nicht erkennst, dann kannst du kaum sinnvoll Quelltext lesen oder verfassen. Du hast ständig mit ihnen zu tun. Man kann sie leicht von Variablen- oder Objektnamen unterscheiden:

    Normalerweise genügt es schon, die Namenskonventionen zu beachten. So können Namen, z.B. für Variablen, nur mit bestimmten Zeichen anfangen, wozu z.B. Ziffern und Anführungszeichen nicht gehören. Letztere leiten normalerweise Literale ein. Selbstverständlich müssen die den Konventionen für Literale genügen:
    0rappeldikatz dürfte demnach kein gültiges Literal sein, während ein für sich stehendes 0 (oder 0L oder 5 oder 5.0 oder 5f ...) ein ziemlich sicheres Zeichen für ein Literal ist. Da ein Literal kein Name (z.B. Bezeichner einer Variablen) ist, kann auch kein entsprechender Name zuvor eingeführt worden sein.
    Ein Literal kann nicht so gebraucht werden, dass an den Wert, den es repräsentiert, etwas zugewiesen wird. Deswegen stehen Literale bei Zuweisungen rechts vom Zuweisungsoperator.

    wie soll ich fragen..
    Wann ist es denn z.B. relevant zu wissen, dass die "0", die da steht, ein Literal ist?
    Immer, wenn das betreffende Literal im Quelltext vorkommt und wenn du ihn verstehen willst.

    Whiz-zarD war schneller. Lies am besten beides.
    jabu is offline Last edited by jabu; 12.09.2018 at 22:50.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •