Warum funktioniert der Vergleichsoperator "==" bei primitiven Datentypen?


04.10.2022, 01:13

Meine Frage bezieht sich auf Java

4 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Das Verhalten des "==" Operators (und anderer Operatoren) ist von der verwendeten Sprache (und ggf. weiteren Bedingungen, in C++ beispielsweise kann man Operatoren "überladen", d. h. man kann selbst definieren, was sie tun) abhängig und daher nicht so zu verallgemeinern.

In Java (steht in den Tags, aber nicht in der Frage selbst) ist es definitiv so. Das liegt daran, dass primitive Datentypen in Java "Wertetypen" sind, während Objekte in Java "Referenztypen" sind. Referenztypen haben die Eigenschaft, dass die Variable die Speicheradresse enthält, an dem der eigentliche "Wert" / die eigentliche Datenstruktur im Hauptspeicher (in diesem Fall im Heap) liegt. Der "=="-Operator vergleicht dann nicht den "Inhalt" der Objekte, sondern den Wert, der in der Variablen steht und das ist bei einem Referenztyp nunmal die Adresse auf dem Heap. Ist diese Adresse gleich, zeigen die Referenzen auf das selbe Objekt und "==" ist true. Ist diese Adresse nicht gleich, zeigen die Referenzen auf unterschiedliche Objekte und "==" ist false.

Variablen werden im RAM gespeichert. Bei dem Wert, der dort gespeichert ist, kann es sich entweder um eine Referenz auf ein Objekt handeln oder um primitive Daten wie int, double, usw.

In Java vergleicht der "==" Operator immer die Werte, die in den Variablen gespeichert sind. Also die Werte, die dort an der entsprechenden Stelle im RAM stehen.

Wenn das int Variablen sind, dann stehen an der Stelle halt die int Werte. Und wenn es Objekte sind, dann stehen da die Referenzen.

Das hat was damit zu tun dass ein primitiver Datentyp praktisch das "niedrigste" ist was im Speicher liegen kann, und Compiler / Interpreter daher immer wissen wie sie diese zu vergleichen haben.

Beispielsweise wird ein "int" oder ein "char" als Bitsequenz im Speicher abgelegt und die Anzahl an primitiven Datentypen ist begrenzt. Man kann dem Compiler/Interpreter daher einmal sagen wie er diese zu Vergleichen hat, das geht bei benutzerdefinierten Datenypen natürlich nicht.

Das ist im übrigen auch der Grund warum zb in C++ oder Python

if(2 == 2.0) // true

true zurückgiebt, da der Compiler/Interpreter bei primitiven Datentypen, da sie nunmal als Bitsequenz auf ganz bestimmte Art und Weise im Speicher liegen, die Werte und nicht die Datentypen abgleicht.

Das ist eigentlich auch ganz logisch und in deiner Frage steckt daher auch kleiner Denkfehler, denn würdest du in C++ zb:

int i = 12;
std::string s = "Hallo";

if(i == s) //Compiler-Fehler

machen, dann bekommst du da nicht "false" oder so zurück, sondern ein Fehler mit der STL dass er aus genannten Gründen nicht weiß wie er diese beiden Datentypen miteinander vergleichen kann, ich weiß jetzt aber ehrlich nicht wie das in anderen Sprachen aussieht.

Es geht also nicht zwangswsweise darum dass der "==" Operator automatisch benutzerdefinierte Datyentypen vergleicht, sondern vielmehr, bei C++ zumindest, Immer die Werte primitiver Vergleicht.

würde man den oben stehenden Ausdruck "gültig" machen wollen, so müsste man den Operator "==" für den Typ int und string überladen, und dabei macht man eigentlich auch nichts anderes als dem Compiler eine "Regel" zu geben inwieweit er den Vergleich zwischen benutzerdefiniertem und primitiven Datentyp zu machen hat, und in dieser Überladung macht man i.d.R auch nichts anderes als den std::string auf primitive Datentypen zu reduzieren und diese dann zu Vergleichen und einen Wert zurückzugeben.

AnonymesSchaf21 
Fragesteller
 04.10.2022, 01:18

Danke für die Antwort👍🏻

1

Bei Datentypen wie int, float, double vergleicht der Operator == keine Referenzen, sondern Werte.

Referenzen werden z.B. in dem folgenden Programmbeispiel (in C) verglichen:

int x, y;
int *ref1_int,
    *ref2_int;
   x = 2;
   y = 2;
   ref1_int = &x;
   ref2_int = &y;
   if (ref1_int == ref2_int) {
     printf("beide Zeiger verweisen auf die gleiche Adresse");
   } else {
     printf("die Zeiger verweisen auf verschiedene Adressen");
   }
Woher ich das weiß:Berufserfahrung – Berufstätigkeit als Software-Entwickler