Perché un char + un altro char = un numero strano
-
19-09-2019 - |
Domanda
Ecco il frammento di codice:
public static void main (String[]arg)
{
char ca = 'a' ;
char cb = 'b' ;
System.out.println (ca + cb) ;
}
L'output è:
195
Perché è questo il caso? Penserei che 'a' + 'b'
sarebbe o "ab"
, "12"
o 3
.
Che cosa sta succedendo qui?
Soluzione
+
di due char
è aggiunta aritmetica, non concatenazione di stringhe. Devi fare qualcosa di simile "" + ca + cb
, o utilizzare String.valueOf
e Character.toString
metodi per garantire che almeno uno degli operandi di +
è un String
per l'operatore di essere concatenazione di stringhe.
JLS 15.18 additivi Operatori
Se il tipo di uno degli operandi di un operatore
+
èString
, l'operazione è concatenazione di stringhe.In caso contrario, il tipo di ciascuno degli operandi dell'operatore
+
deve essere un tipo che è convertibile in un tipo numerico primitivo, altrimenti si verifica un errore di compilazione.
Per quanto riguarda il motivo per cui si sta ottenendo 195, è perché in ASCII, 'a' = 97
e 'b' = 98
e 97 + 98 = 195
.
Questa esegue int
e char
fusione di base.
char ch = 'a';
int i = (int) ch;
System.out.println(i); // prints "97"
ch = (char) 99;
System.out.println(ch); // prints "c"
Questo ignora la questione di schemi di codifica dei caratteri (che un principiante non dovrebbe preoccuparsi ... ancora!).
Come nota, Josh Bloch ha notato che è piuttosto spiacevole che +
è sovraccarico sia per la concatenazione di stringhe e l'aggiunta intero ( "Potrebbe essere stato un errore di sovraccaricare l'operatore + per la concatenazione di stringhe." - Java puzzlers , Puzzle 11: The last Laugh). Un sacco di questo tipo di confusione potrebbe essere stato facilmente evitato con un gettone differente per la concatenazione di stringhe.
Vedere anche
Altri suggerimenti
Non parlo di Java, ma 195 è 97 + 98 = i codici ASCII per a
e b
. Così, ovviamente, ca
e cb
sono interpretati come i loro valori interi, probabilmente a causa del l'aggiunta +
che non sembra portare ad una concatenazione di stringhe automaticamente.
Se si desidera avere una stringa come risultato dell'operatore + è necessario utilizzare tipo String come operandi.
Si dovrebbe scrivere:
public static void main (String[]arg)
{
String ca = "a" ;
String cb = "b" ;
System.out.println (ca + cb) ;
}
L'operatore + applicato su operandi char si comporta come somma aritmetica.
L'operatore +
non funziona su personaggi come fa su stringhe. Quello che sta succedendo qui è che a
e b
vengono gettati alle loro interi Codepoints ASCII - 97 e 98 -. E poi sommati