2015-12-29 16 views
9

In diesem Code-Snippet:Was ist der Punkt des Gusses?

c = (char)(c - 'A' + 'a'); 

Warum brauchen wir die (char)? Das ist Typ Casting richtig?

Angenommen, die c auf der rechten Seite der Zuweisungsanweisung ist ein Großbuchstabe. Ich nehme an, wir machen hier Unicode Addition und Subtraktion.

Dies ist der Ausschnitt aus dem Java-Buch, das ich lese:

Wenn Arithmetik auf einem char geschehen ist, es zunächst auf die int umgewandelt wird, die es in dem Unicode-System darstellt. Subtrahieren 'A' von einer Variable c im Wesentlichen fragt "Wie weit in die Großbuchstaben ist das Zeichen in c?" Hinzufügen von 'a' ergibt dann die Int Abstand in die Reihenfolge der Kleinbuchstaben Zeichencode. Die Umwandlung in char wird benötigt, da char eine spezielle Art von int mit eine begrenzte Anzahl von Werten ist. Durch die Verwendung des Gusses erkennt der Programmierer , dass er oder sie den besonderen Charakter der Zuordnung versteht und erwartet, dass der Wert im richtigen Bereich zu sein, 0 bis 66535.

Ich verstehe nicht, den Punkt von der (char) Besetzung? Was wäre anders, wenn wir den (char) Cast nicht verwenden würden? Was ist Casting allgemein?

+1

In einfachen Worten: In Java Nummer 8 kann als ein Zeichen und nicht Integer genommen werden .... so 8 + 8 Mai giv 88 und nicht 16 ... da 8 als Integer für athletische Operation, wir betrachtet werden type caste als 'int' –

Antwort

7

char ist ein integral type in Java, und wenn Sie Arithmetik auszuführen ist das Ergebnis ein int (JLS-4.2.2. Integer Operations sagt, teilweise die numerischen Operatoren, die in einem Wert vom Typ führen int oder long und fügt hinzu, dass enthält die additiven Operatoren + und -).

char c = 'A'; 
System.out.printf("'%c' = %d%n", c, (int) c); 
int d = (c - 'A' + 'a'); // c - 65 + 97 
System.out.printf("'%c' = %d%n", (char) d, d); 

Und ich

'A' = 65 
'a' = 97 
+0

Ich muss diese String-Formate entschlüsseln ... – Jwan622

+1

% markiert eine Variable, c ist für char, d für dezimal, n für Newline, die Variablen werden in der gleichen Reihenfolge wie in der Zeichenfolge als Parameter bereitgestellt schlussendlich. Für eine Liste der Dinge, die Sie in Formaten tun können, können Sie sehen https://docs.oracle.com/javase/tutorial/java/data/numberformat.html – HopefullyHelpful

+1

Auch Flags können zwischen dem% und dem Variablentyp verwendet werden, z . '% 10d' würde eine Zahl so formatieren, dass sie 10 Zeichen (gefüllt mit Leerzeichen oder Nullen) benötigt. – HopefullyHelpful

7

Dies ist zu numeric promotion fällig. Unter Angabe der JLS section 15.18.2:

Der binäre + Operator durchführt, wenn zusätzlich zu zwei Operanden von numerischem Typ angewandt, um die Summe der Operanden zu erzeugen.

Der binäre --Operator führt eine Subtraktion durch und erzeugt die Differenz zweier numerischer Operanden.

Binäre numerische Heraufstufung wird an den Operanden durchgeführt (§5.6.2).

Die numerische Förderung in diesem Fall ist eine widening primitive conversion. Zitiert section 5.6.2:

Widening primitive Umwandlung (§5.1.2) wird entweder oder beiden Operanden zu konvertieren, wie durch die folgenden Regeln festgelegt:
...

  • Andernfalls werden beide Operanden umgewandelt int einzugeben.

Also in Ihrem Beispiel ist die Besetzung zu char notwendig, da der Zusatz auf einen int Wert durchgeführt wird, so das Ergebnis ist ebenfalls vom Typ int. Um dies in einer char zu speichern, benötigen Sie eine explizite Besetzung.

2

Alles, was Sie in der Programmierung tun, geben Werte an Variablen. Diese Variablen können unterschiedlicher Art sein. Am Ende ist alles eine Nummer, die auf eine bestimmte Art behandelt wird, oder eine Sequenz/Zahlengruppe, die als eine "Entität" behandelt wird. Variablen unterschiedlicher Typen können unterschiedlich viel Platz einnehmen.

Wenn Sie zwei Dinge auf unterschiedliche Weise behandelt haben und unterschiedliche Mengen an Speicherplatz benötigen, benötigen Sie einen gut definierten Weg, um zwischen den 2 Dingen zu konvertieren, dies wird durch Casting und Operatoren durchgeführt. Ein Operator nimmt eine Anzahl von Eingaben und gibt eine Ausgabe aus. + und - nehmen normalerweise 2 Eingaben und geben 1 zurück.

In Ihrem Fall verwendeten Sie Operatoren, die Zeichen nehmen, ihre Bits nehmen und sie als Zahlen verwenden und Ihnen die resultierende Zahl als int zurückgeben. Dann müssen Sie diese Zahl manuell in einen Buchstaben umwandeln, da Sie möglicherweise Bytes verlieren könnten. Auch die explizite Besetzung verhindert hier Fehler von Programmierern, die mit Zahlen umgehen und sie versehentlich in einen Buchstaben umwandeln, sie werden vom Compiler gewarnt. Letztendlich kommt es auf die Spezifikationen an, die genau erklären, was für jeden Eingabetyp und jeden Operator passiert.

Die meiste Zeit Casting ist getan, um Ihnen eine intuitive und einfache Möglichkeit der Konvertierung von Typen, wenn es so ist. Meistens wird dies mit Zahlen gemacht, da der einzige Unterschied die Anzahl der angebotenen Bises (Byte, Short, Int, Long) und manchmal die interne Berechnung (Float, Double) ist. In diesen Fällen ist das Abschneiden und Runden einfach, indem Sie auf einen Typ mit weniger Bytes oder einer ganzzahligen Repräsentation umwandeln. Das Hinzufügen von Bytes oder das Ändern der Darstellung zum Dezimalpunkt erfolgt durch Umsetzen in einen Typ mit mehreren Bytes oder einem Typ mit Gleitkomma Darstellung.

Auf der anderen Seite gibt es Zeiten, wenn Sie ein Objekt als einen allgemeineren Fall behandeln und es auf einen Vorfahrentyp (auch Super-Typ usw. genannt) umwandeln möchten. Z.B. Wenn Sie Objekte sortieren, interessiert es Sie vielleicht nicht, welchen genauen Typ Sie behandeln, wenn Sie einen Sortieralgorithmus schreiben.

Verwandte Themen