it-swarm.com.de

Java-Zeichen, int-Konvertierungen

In Java ist Folgendes zulässig:

char c = 'A' + 1;

Hier wird c den Wert 'B' halten. Oben wird zuerst der Ausdruck ausgewertet. 'A' wird also zu 65 konvertiert, der gesamte Ausdruck wird zu 66 ausgewertet und dann wird 66 zu 'B' konvertiert, da der Wert in einem Zeichen gespeichert wird.

Das folgende gibt jedoch einen Fehler bei der Kompilierung aus:

char c = 'A';
c = c + 1;

Was ist die Erklärung dafür, wie Java die Ausdrücke unterschiedlich betrachtet? Folgendes funktioniert übrigens auch gut:

char c = 'A';
c++;
37
Cosmic_Dust

Das erste Beispiel (das kompiliert) ist etwas Besonderes, da beide Operanden der Addition Literale sind.

Ein paar Definitionen zu Beginn:

  • Die Konvertierung von int in char wird als Eingrenzung der primitiven Konvertierung bezeichnet, da char ein kleinerer Typ als int ist. .

  • 'A' + 1 ist ein konstanter Ausdruck . Ein konstanter Ausdruck ist (im Grunde) ein Ausdruck, dessen Ergebnis immer dasselbe ist und der zur Kompilierungszeit bestimmt werden kann. Insbesondere ist 'A' + 1 ein konstanter Ausdruck, da die Operanden von + beide Literale sind.

Bei den Zuweisungen von byte, short und char ist eine einschränkende Konvertierung zulässig. if Die rechte Seite der Zuweisung ist eine Konstante Ausdruck :

Wenn der Ausdruck [auf der rechten Seite] ein konstanter Ausdruck vom Typ byte, short, char oder int ist:

  • Eine einschränkende primitive Konvertierung kann verwendet werden, wenn die Variable vom Typ byte, short oder char ist und der Wert des konstanten Ausdrucks im Typ der Variablen darstellbar ist.

c + 1 ist nicht ​​ein konstanter Ausdruck, da c eine Variable ist, die nicht final ist, sodass bei der Zuweisung ein Fehler beim Kompilieren auftritt. Anhand des Codes kann wir feststellen, dass das Ergebnis immer dasselbe ist, aber der Compiler darf das in diesem Fall nicht.

Eine interessante Sache, die wir tun können, ist folgende:

final char a = 'a';
char b = a + 1;

In diesem Fall ist a + 1is ein konstanter Ausdruck, da a eine final Variable ist, die mit einem konstanten Ausdruck initialisiert wird.

Die Warnung "Wenn […] der Wert […] im Typ der Variablen darstellbar ist" bedeutet, dass Folgendes nicht kompiliert werden kann:

char c = 'A' + 99999;

Der Wert von 'A' + 99999 (das ist 100064 oder 0x186E0) ist zu groß, um in ein char zu passen, weil char ist ein vorzeichenlose 16-Bit-Ganzzahl .


Bezüglich des Postfix-Operators ++ :

Der Typ des Postfix-Inkrementausdrucks ist der Typ der Variablen.

...

Vor dem Hinzufügen wird eine binäre numerische Heraufstufung * für den Wert 1 und den Wert der Variablen durchgeführt. Falls erforderlich, wird die Summe durch eine einschränkende primitive Konvertierung eingegrenzt und/oder vor dem Speichern einer Boxing-Konvertierung in den Variablentyp unterzogen.

(* binäre numerische Heraufstufung nimmt die Operanden byte, short und char von Operatoren wie + und konvertiert sie in int oder ein anderer größerer Typ Java rechnet nicht mit ganzzahligen Typen, die kleiner als int sind. )

Mit anderen Worten, die Anweisung c++; ist größtenteils äquivalent zu:

c = (char)(c + 1);

(Der Unterschied besteht darin, dass das Ergebnis des Ausdrucks c++, wenn wir es etwas zugeordnet haben, der Wert von cvor des Inkrements ist. )

Die anderen Inkremente und Dekremente haben sehr ähnliche Spezifikationen.

Verknüpfungszuweisungsoperatoren wie += führen ebenfalls automatisch eine Verengungskonvertierung durch , daher sind auch Ausdrücke wie c += 1 (oder sogar c += 3.14) zulässig.

38
Radiodef

konvertierung von Char in Int. wird Konvertierung als Verbreiterung bezeichnet. Beim Erweitern von Konvertierungen verlieren Werte keine Informationen über die Gesamtgröße eines numerischen Werts, bei dem die Konvertierung von int in Zeichen als Konvertierung von Engpass bezeichnet wird. Bei einer engeren Konvertierung können Sie Informationen über die Gesamtgröße eines numerischen Werts und möglicherweise auch die Genauigkeit verlieren.

Weitere Informationen zu primitiven Konvertierungen finden Sie in this document.

4
RMachnik

Dies liegt daran, dass der Compiler überprüfen kann, dass ('A' + 1) sich innerhalb der Grenzen eines Zeichens befindet, während er (im Allgemeinen) nicht überprüfen kann, dass c + <an integer> innerhalb der Grenzen liegt.

3
Brian

Sein, weil die Literale für Ganzzahl oder kleiner als Int als Byte, Kurz und Zeichen Int sind. Verstehe das Folgende auf diese Weise. 

code: 

  byte a = 10;//compile fine
  byte b= 11;//compile fine
  byte c = a+b;//compiler error[says that result of **a+b** is **int**]

das Gleiche gilt für alle mathematischen Operationen wie 'Divide', 'Multiplizieren' und andere arithmetische Operationen. Geben Sie das Ergebnis so um, dass das Literal im gewünschten Datentyp angezeigt wird

byte c = (byte)(a+b);

also wenn du performst

   c= c+1;//compiler error

Das Ergebnis von c + 1 ist int kein Zeichen. Der Compiler gibt also einen Kompilierungsfehler für dasselbe . Sie müssen also einen primitiven Cast angeben, um das Literal in den Datentyp char zu ändern.

0
vinod bazari