Dans le programme ci-dessous, nous pouvons effectuer l'opération ch1 ++ mais pas en mesure d'exécuter ch1 = ch1 + 1

    public static void main(String[] args) {
    // TODO Auto-generated method stub

    char ch1 = 88;
    System.out.println("Ch1 is " + ch1);

    ch1=ch1+1;
    ch1++;
    System.out.println("ch1 is "+ch1);
}
2
Akash Chavan 20 avril 2017 à 22:22

3 réponses

Meilleure réponse

ch1+1 a un type entier, vous devez le convertir en char, comme ça:

(char)(ch1+1)

En plus de détails:

Java voir deux valeurs, un type char, un type entier (1 est un entier), pour effectuer l'opération +, java doit avoir les deux arguments identiques, le moyen le plus sûr est de promouvoir char en {{X2} }, c'est pourquoi le résultat est int

ch1++ est différent, java traite cette construction comme:

ch1 = (char)(ch1+1)

Donc, la distribution est ajoutée automatiquement

2
Iłya Bursov 20 avril 2017 à 19:29

Selon la spécification Java,

Le type d'une expression additive sur les opérandes numériques est le type promu de ses opérandes.

Tandis que

le type du préfixe et postfix expression d'incrémentation est le type de la variable ... Avant l'ajout, une promotion numérique binaire (§5.6.2) est effectuée sur la valeur 1 et la valeur de la variable. Si nécessaire, la somme est rétrécie par une conversion primitive restrictive (§5.1.3) et / ou soumise à une conversion boxing (§5.1.7) au type de la variable avant qu'elle ne soit stockée.

(pas d'italique dans l'original)

Donc, utiliser + applique d'abord un Élargissement de la conversion primitive aux opérandes, les transformant en entiers, puis conserve ce type promu comme résultat de l'expression. ++ applique également la promotion, mais ajoute également une étape de réduction par la suite afin que le type de résultat soit le même que le type de la variable d'origine.

Ce comportement a du sens, car vous savez qu'un ++ modifie la valeur du paramètre d'origine, alors que le résultat d'une opération + pourrait être enregistré dans une autre valeur:

int i = Character.MAX_VALUE + 1;

Comme le soulignent les autres réponses, si vous souhaitez enregistrer le résultat d'une addition dans une variable de caractère, le résultat entier d'une opération + devra être converti en char, comme ce:

ch1 = (char)(ch1+1)
1
StriplingWarrior 20 avril 2017 à 19:51

Vous devez lancer ch + 1 en a (char), car le résultat de 1 + ch1 est un int

ch1=(char)ch1+1;
0
ControlAltDel 20 avril 2017 à 19:24