Considérez l'extrait de code ci-dessous -
7 7 34 34
La sortie de l'extrait de code ci-dessus arrive comme -
public class Student { public static void main(String args[]) { int a = 3; int b = 4; System.out.println(a + b +" "); System.out.println(a + b +" "+ a+b); System.out.println(""+ a+b); } }
Il ressort clairement du sortie que si nous utilisons String au début dans l'instruction d'impression, les entiers sont concaténés. Mais, si nous utilisons un entier au début, les valeurs sont ajoutées et affichées.
Quelqu'un peut-il expliquer pourquoi ce comportement?
J'ai même essayé de regarder l'implémentation de println ( ) dans la classe PrintStream mais n'a pas pu comprendre.
3 Réponses :
En fait, ce n'est pas l'implémentation println ()
qui est à l'origine de cela, c'est une manière Java
de traiter l'opérateur +
lorsqu'il s'agit de Chaînes
.
En fait l'opération est traitée de gauche à droite donc:
chaîne
précède int
(ou tout autre type) dans l'opération String
conversion est utilisé et tous les autres opérandes seront traité comme des chaînes
, et il consiste uniquement en une opération de concaténation String
. int
vient en premier dans l'opération, il sera traité comme int
, donc l'opération addition
est utilisée . C'est pourquoi a + b + ""
donne 7
car String
est à la fin de l'opération, et pour les autres expressions a + b + "" + a + b
ou "" + a + b
, les variables a
et b
être traitée comme des chaînes
si elles viennent après une chaîne
dans l'expression.
Pour plus de détails, vous pouvez consulter Opérateur de concaténation de chaînes + dans les spécifications Java .
Premier cas:
System.out.println(""+ a+b);
Dans cet ordre, a + b
sera d'abord évalué comme une somme int, puis converti en une chaîne lors de l'ajout de l'espace (le deuxième +
ici est pour la concaténation de chaînes).
Deuxième cas:
System.out.println(a + b +" "+ a+b);
Ici, la première partie sera une opération de somme int puis convertie en une chaîne lorsque nous ajoutons le space (le 2ème +
est pour la concaténation de chaînes), le reste sera une concaténation de chaînes car l'opérande de gauche est déjà une chaîne.
Troisième cas:
System.out.println(a + b +" ");
Identique au deuxième.
Pour changer ce comportement, ajoutez simplement des parenthèses pour forcer la somme int
avant le chaîne
concaténations.
Cela n'a rien à voir avec l'implémentation de println
. La valeur de l'expression passée à println
est évaluée avant l'exécution de println
.
Il est évalué de gauche à droite. Tant que les deux opérandes de +
sont numériques, l'addition sera effectuée. Une fois qu'au moins l'un des opérandes est une String
, la concaténation de String
sera effectuée.
System.out.println(a + b + " "); // int + int int + String // addition, concatenation System.out.println(a + b + " " + a + b); // int + int int + String Str+Str Str+Str // addition, concat, concat, concat System.out.println("" + a + b); // String+int String+int // concat, concat
ce que vous avez décrit, c'est le comportement. la concaténation ne saura qu'il s'agit d'une concaténation String qu'une fois qu'elle détectera une chaîne. faire l'ajout de int avant une chaîne, et il exécutera cette augmentation avant de passer sa première chaîne
Cela n'a rien à voir avec
println
, c'est ainsi que les expressions sont résolues en Java.