Java - char, int conversions
En Java, le suivant est autorisé:
char c = 'A' + 1;
Ici, c contiendra la valeur "B". Ci-dessus, d'abord l'expression est évaluée. Si 'A' est converti à 65 ans, l'ensemble de l'expression est évaluée à 66, et puis 66 est converti en " B " depuis que nous sommes stocker la valeur dans un char.
La suite, cependant, donne une erreur de compilation:
char c = 'A';
c = c + 1;
Qu'est-ce que l'explication de la façon dont Java vues les expressions différemment? Par ailleurs, le suivant fonctionne très bien aussi:
char c = 'A';
c++;
- Veuillez vous référer à la question suivante et specfically à rgettman de réponse: stackoverflow.com/questions/18648283/...
- Je ne suis pas sûr si, en disant que 66 est converti à 'B' est un précis de dire. Les personnages sont essentiellement des chiffres déjà.
- C'est un point intéressant si le spec ne décrivent char comme un éventail de points de code ainsi que la gamme intégrale. Pour les littéraux, un caractère littéral ("B") est toujours de type char et bien sûr 66 est toujours de type int. Peut-être le plus précis serait de dire qu'elle est convertie en '\u0042 " (un code numérique qui est toujours de type char).
- C'est une bonne question , je n'ai pas vu comme ça avant. Génial question. Et votre réponse est-elle grande et complété pour le vôtre.
Vous devez vous connecter pour publier un commentaire.
Le premier exemple (qui compile) est spécial parce que les deux opérandes de l'addition sont des littéraux.
Quelques définitions pour commencer:
De la conversion d'un
int
àchar
est appelé un rétrécissement primitives de conversion, parce quechar
est un type plus petit queint
.'A' + 1
est un expression constante. Une expression constante est (en gros) une expression dont le résultat est toujours le même et peut être déterminée au moment de la compilation. En particulier,'A' + 1
est une expression constante parce que les opérandes de+
sont les deux littéraux.Un rétrécissement de conversion est autorisée pendant les missions de
byte
,court
etchar
, si la partie droite de l'affectation est une expression constante:c + 1
est pas une expression constante, parce quec
est un non-final
variable, donc une erreur de compilation se produit de la cession. En regardant le code, nous peut déterminer que le résultat est toujours le même, mais le compilateur n'est pas autorisé à le faire dans ce cas.Une chose intéressante que nous pouvons faire est ceci:
Dans ce cas
a + 1
est une expression constante, parce quea
est unfinal
variable qui est initialisé avec une expression constante.La mise en garde "si [...] la valeur [...] est représentable dans le type de la variable" signifie que le suivant ne compile pas:
La valeur de
'A' + 99999
(qui est100064
, ou0x186E0
) est trop grand pour tenir dans unechar
, parce quechar
est un entier non signé entier 16 bits.Comme pour le postfix
++
de l'opérateur:(* Binaire numérique de promotion de la prend
byte
,short
etchar
opérandes des opérateurs tels que+
et les convertit enint
ou certains autres caractères plus grands. Java n'est pas de faire de l'arithmétique sur les types intégraux plus petit queint
.)En d'autres termes, la déclaration
c++;
est quasiment équivalent à:(La différence est que le résultat de l'expression
c++
, si l'on a attribué à quelque chose, est la valeur dec
avant l'incrément.)L'autre incrémente et décrémente sont très similaires spécifications.
Composé d'affectation des opérateurs tels que
+=
effectuer automatiquement une conversion restrictive ainsi, de sorte que des expressions telles quec += 1
(ou mêmec += 3.14
) sont également autorisées.char c = (char)('A' + 99999);
.char, int conversion est appelée l'élargissement de conversions. Dans l'élargissement de conversions, de valeurs, de ne pas perdre d'informations sur l'ampleur globale d'une valeur numérique où que int en char de conversion est appelée rétrécissement des conversions. Avec le rétrécissement de conversion vous risquez de perdre des informations sur l'ampleur globale d'une valeur numérique et peut aussi perdre de la précision.
Pour plus d'informations sur les primitives des conversions reportez-vous cette document.
C'est parce que le compilateur peut vérifier qu'il
('A' + 1)
est dans les limites d'un char alors qu'il ne peut pas (en général) vérifier quec + <an integer>
est dans les limites.Son parce que les littéraux pour l'entier inférieur ou int as byte ,short et le char est int. Comprendre la suite de cette façon.
code:
le même phénomène se produit pour toutes les opérations mathématiques comme de la "Fracture", "multiplier", et d'autres opérations arithmétiques. ainsi jeté le résultat à obtenir la lettre souhaitée type de données
ainsi, lorsque vous effectuez
Ses le résultat de c+1 est de type int pas un char . donc le compilateur donne une erreur de compilation pour la même chose.
vous devez donc fournir une primitive de fonte pour changer le sens littéral de type de données char.
Espérons que cet exemple donne une certaine compréhension..