Wieso ändern sich die Werte?

Maurice16

Mitglied
So nun habe ich ein weiteres Problem =)

Java:
class Versuch2a {
 static public void main(String [] args) {
  int i1=50;
  int i2=70;
  int i3=111222333;
  char c1='e';
  char c2='K';
  char c3;
  String s1="HELLO";
  String s2=" WORLD";
  c3=(char)i3;
  i3=(int)c3;
  System.out.println(i1+i2);
  System.out.println((char)(i1+i2)+"\n"+(char)i1+(char)i2);
  System.out.println((char)i1+i2+"\t"+(char)i2+i1+"\t"+((int)c1-i1));
  System.out.println((char)i2+i1+"\t"+(char)i1+i2+"\t"+((int)c1-i1));
  System.out.println(""+(char)i2+i1+"\t"+(char)i1+i2+"\t"+((int)c1-i2));
  System.out.println(c1+"t"+((int)c1)+i2+c2);
  System.out.println(s1+s2);
  System.out.println(i3);
 }
}
Hier mal das ganze Programm ( wenn man das als solches bezeichen kann/darf)

wieso kommt bei

System.out.println((char)i1+i2+"\t"+(char)i2+i1+"\t"+((int)c1-i1));
120 F50 51


raus und bei

System.out.println((char)i2+i1+"\t"+(char)i1+i2+"\t"+((int)c1-i1));
120 270 51


raus, obwohl die ersten 2 ausdrücke

(char)i1+i2+"\t"+(char)i2+i1

nur vertauscht wurden.
Und es kommt was unterschiedliches raus?

Danke
 
Zuletzt bearbeitet:
Waere super wenn du deinen Code in Code-Tags schreibst, dann ist er einfacher zu lesen :)
[JAVA ] code hier [ /JAVA] (ohne die Leerzeichen)

Java:
class Versuch2a {
	static public void main(String[] args) {
		int i1 = 50;
		int i2 = 70;
		int i3 = 111222333;
		char c1 = 'e';
		char c2 = 'K';
		char c3;
		String s1 = "HELLO";
		String s2 = " WORLD";
		c3 = (char) i3;
		i3 = c3;
		System.out.println(i1 + i2);
		System.out.println((char) (i1 + i2) + "\n" + (char) i1 + (char) i2);
		System.out.println((char) i1 + i2 + "\t" + (char) i2 + i1 + "\t" + (c1 - i1));
		System.out.println((char) i2 + i1 + "\t" + (char) i1 + i2 + "\t" + (c1 - i1));
		System.out.println("" + (char) i2 + i1 + "\t" + (char) i1 + i2 + "\t" + (c1 - i2));
		System.out.println(c1 + "t" + ((int) c1) + i2 + c2);
		System.out.println(s1 + s2);
		System.out.println(i3);
	}
}

System.out.println((char)i1+i2+"\t"+(char)i2+i1+"\t"+((int)c1-i1));

System.out.println((char)i2+i1+"\t"+(char)i1+i2+"\t"+((int)c1-i1));
 
Das liegt an der Verarbeitungsreihenfolge. Mich wundert es eher warum er am Anfang beide male 120 ausgibt. Aber ich nehme an dass das folgendermaßen abläuft (ich nehm mal nur die erste Zeile der beiden):

Erst castet er i2 zu einem char. Dann addiert er da i2 drauf. Weil ints nen größeren Wertebereich haben wird das Ergebnis (120) zu nem int. Dann kommt ein bisschen String, so dass er aus den 120 auch nen String macht.

Dann kommt dein (char)i2. Er wandelt hier i2 zu nem char um und weil er das an nen String ran packt macht er gleich nen String draus. dann hängt er i1 als String dran und so weiter.

Kurz: Benutz Klammern um die Bearbeitungsreihenfolge zu steuern.

MfG,
DarkWizzard
 
Habe es immer noch nicht ganz verstanden wieso das selbe zB (char)i1+i2 an einer unterschiedlichen stelle etwas anderes ergibt.
Vllt. könnte mir das jemand nochmal erläutern.
Wie man einmal auf 120 und einmal auf 270 kommt ist mir klar.
Einmal wird die i1 (50) nur unter 16 byts gespeichter, da verändert sich jedoch nichts.
Und beim anderen mal wird auf der 50 aus der ascii tabelle eine "2".
Aber woher weiß man was wo benutzt wird?
Danke
 
Moin,

Java:
class Versuch2a 
{
	static public void main(String[] args) 
        {
		int i1 = 50;
		int i2 = 70;
		System.out.println(i1 + i2);
		System.out.println((char) (i1 + i2) + "\n" + (char) i1 + (char) i2);
		System.out.println((char) i1 + i2 + "\t" + (char) i2 + i1 + "\t" + (c1 - i1));
	}
}

schau Dir mal Deine Klammerungen an :
"i1 + i2" != "(char)(i1 + i2)" != "(char)i1 + i2" :)

Gruß
Klaus
 
Ich meinte diese Zeilen
Java:
System.out.println((char)i1+i2+"\t"+(char)i2+i1+"\t"+((int)c1-i1));
System.out.println((char)i2+i1+"\t"+(char)i1+i2+"\t"+((int)c1-i1));
Die Ausgaben
120 F50 51
120 270 51

Wieso ist es einmal F50 und anderes mal 120?
Wieso ist es einmal 270 und anderes mal 120?
 
Zuletzt bearbeitet:
Bei den 120 zählt er es erstmal einfach zusammen (Bearbeitungsreihenfolge von links nach rechts). 50 oder 70 gehen problemlos in den Wertebereich von chars rein. Wenn er "char + int" rechnet kommt "int" raus. Erst danach merkt er dass das ein String werden soll und macht aus der 120 halt nen String.

und danach die F50 und 270: Wieder von links nach rechts! Er hat von davor schon nen String. Da soll jetzt der "char" mit dem Wert 70 bzw 50 ran. Wenn du mal in der Ascii-Tabelle nachschaust ist 70 der Wert für "F" und 50 der Wert für "2". Die packt er also jeweils an den String ran. Danach sieht er, dass noch ein "int" an den String ran gepackt werden soll und macht das halt.
 
ok die erste Zahl habe ich verstanden ist halt zB char von 50 + int von 70 (char+int=int) deshalb 120.
aber wieso macht er das dann bei der 2. zahl anderes? behält der da bei der 50ig das char? weil das schon davor einmal stand?
Was genau ist ein String?

Danke für jede Antwort
 
Ein String ist eine Zeichenkette. "bla" ist zum Beispiel ein String. Und wenn du

Code:
System.out.println("bla" + 5);

machst, wird an den ersten String "bla" die String-Darstellung von 5 ran gehängt.
Und genau das ist es, was bei dir passiert.

Code:
(char)i1+i2+"\t"...

Bis hierhin wurde alles in einen String umgewandelt.
Und jetzt machst du noch

Code:
+(char)i2+i1+...

er wandelt erst den integer-Wert in einen char-Wert um. Dann hängt er das an den String und wandelt es dafür auch in einen String um. Erst danach geht er weiter nach rechts und guckt sich i1 an. Das wandelt er auch in einen String um und hängt es auch an den String ran der schon links davon steht. Und so weiter.
 
Zurück