2017-05-18 3 views
0

Was ist der Datentyp von x + y?Benötigen Sie Hilfe zum Verständnis, warum dieser Code nicht kompiliert wird

doppelt x = 39,21;

float y = 2,1;

Erläuterung:

Dies ist eigentlich ein Trick Frage, da dieser Code nicht kompilieren! Als erinnern Sie sich vielleicht aus Kapitel 1, dass Fließkomma-Literale doppelt angenommen werden, es sei denn, mit einem f wie in 2.1f nachfixiert. Wenn der Wert ordnungsgemäß auf 2.1f festgelegt wäre, wäre die Heraufstufung ähnlich dem letzten Beispiel , wobei beide Operanden zu einem Double hochgestuft werden, und das Ergebnis wäre ein doppelter Wert.

Aber ich verstehe nicht. Wenn float y = 2,1; wurde angenommen, dass doppelt würde es keine Notwendigkeit für die Förderung von Variable y zum Doppel. Und ich bin mehr verwirrt durch das nächste Problem, das ist:

Was ist der Datentyp von x * y/z?

kurz x = 14; float y = 13; Doppelz = 30;

Das Buch sagt, dass dies sogar den Float y = 13 kompilieren wird; ist nicht float y = 13f. Füge ich nur f neben der Gleitkommazahl hinzu, wenn sie dezimal sind? Ich kann wirklich den Unterschied zwischen diesem Problem und dem oben erwähnten Problem nicht sehen.

+4

y ist als Schwimmer zugeordnet. Der wörtliche Ausdruck "2.1" (ohne ein explizites hinteres f) ist ein Double. Es wird nicht kompiliert, weil Sie kein größeres Double in einen kleineren Float stopfen können. –

+1

Sie können jedoch einem float ein int '13' zuweisen, da ein int zu einem float hochgestuft werden kann. –

+0

In Verbindung stehend: http://stackoverflow.com/questions/28361456/why-explicit-type-casting-required-from-double-to-float-but-not-from-int-to-byte –

Antwort

3

Ignorieren char, wird Java numerischen Typen wie diese fördern:

byte > short > int > long > float > double 

Diese nennt Erweiterungskonvertierungen. Siehe JLS §5.1.2. Widening Primitive Conversion für Details.

Binäre Operatoren werden int, long, fördern float oder double, je nachdem, was am nächsten aus den beiden Werten des Betreibers ist, das heißt Ergebnis nie byte oder short sein. Beispiel: byte + short wird beide Seiten zu int fördern. Einzelheiten siehe JLS §5.6.2. Binary Numeric Promotion.

Der Zuweisungsoperator wird auch tut Umwandlung Verbreiterung des Wertes, mit dem zusätzlichen Regel, dass ein konstanter Ausdruck vom Typ byte, short oder int durch ein narrowing conversion gehen wird, wenn der Typ der Variablen ist byte oder short, und der Wert des konstanten Ausdrucks ist im Typ darstellbar. Beachten Sie, dass es keine Regel für die double Konstante auf float gibt. Einzelheiten siehe JLS §5.2. Assignment Contexts.

Also, für Ihren Code:

double x = 39.21; // double constant to double (identity conversion) 
float y = 2.1; // fails because double constant cannot promote to float 

Wenn Code kompiliert hatte, was ist der Datentyp x + y?

x + y // double + float promotes to double 

Antwort: double

Nächster Teil:

short x = 14; // narrowing conversion of int constant to short 
float y = 13; // widening conversion of int constant to float 
double z = 30; // widening conversion of int constant to double 

Nun, was ist der Datentyp x * y/z?

x * y  // short * float promotes to float 
(x * y)/z // (float)/double promotes to double 

Antwort: double

0

Für die erste Frage können Sie einen Float (mit einem doppelten Wert) nicht als doppelten Wert initialisieren. Mit der 2.1f wird dieser Wert als Float initialisiert. Sie müssten also y = 2.1f. Sie können mehr darüber lesen here

Für die zweite Frage, der Grund, warum dies funktioniert, ist der Float eine Ganzzahl (13), die zum Typ Float heraufgestuft werden kann.

+0

* "der Floss ist eine ganze Zahl "*? Meinst du "der * Wert * ist eine ganze Zahl" – Andreas

0

Wie in diesem post erwähnt, wenn Sie das Zeichen "f" nach den Ziffern nicht angeben, wird der Wert als ein Doppel behandelt.

Mit diesem gesagt wird der Code unten kompiliert, aber nur, wenn das Zeichen "f" am Ende des Fließkommawerts hinzugefügt wird.

double x = 7.0; 
float y = 2.0f; 
System.out.print(x + y); 
+0

Sie haben Recht, ich habe mein Verständnis missverstanden. Entschuldige mich dafür. – Koshux

+0

Aber wenn der Wert von y als Doppel behandelt wird, dann sollte x + y immer noch funktionieren, da es doppelt + doppelt ist? – user3000482

+0

@MadPhysicist Antwort erklärt es richtig. – Koshux

Verwandte Themen