Laden...

Vergleichsoperator ===

Erstellt von kolli vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.387 Views
K
kolli Themenstarter:in
80 Beiträge seit 2007
vor 15 Jahren
Vergleichsoperator ===

Hi,

ich hab beim stöbern auf Wikipedia gerade folgenden Artikel gelesen:
http://de.wikipedia.org/wiki/Vergleichsoperator

Dort steht in der Tabelle der Vergleichsoperator "===", der auf Identität prüft. Was genau ist in einer programmierssprache/der Informatik/boolschen Logik der Unterschied zwischen "gleich" und "identisch"?

Und die wichtigste Frage: wann und warum sollte ich das in C# verwenden/vermeiden?

N
203 Beiträge seit 2008
vor 15 Jahren

Würde spontan schätzen, das identisch bedeutet, dass die Variablen auf den gleichen Speicherplatz zeigen. Gleich würde dann nur bedeuten das die Inhalte den gleichen Wert aufweisen.

Signatur.Text = "Greetz, Neals";

K
kolli Themenstarter:in
80 Beiträge seit 2007
vor 15 Jahren

Würde das nicht implizieren, dass es Pointer gibt? Aber die gibt es in C# ja nicht.

N
203 Beiträge seit 2008
vor 15 Jahren

Indirekt sind die Variablen ja Zeiger auf Speicherplätze. Es gibt Pointer in C#, aber die werden als "unsafe" behandelt.

Signatur.Text = "Greetz, Neals";

K
kolli Themenstarter:in
80 Beiträge seit 2007
vor 15 Jahren

Ah, das wusste ich gar nicht. Hab schnell mal nach "C# Pointer" gegooglet:
Der Operator wird auf WP auch mit "=== *" bezeichnet, wobei der Stern für den Pointer steht.

Also kann man davon ausgehen, dass man das im normalen Leben niemals brauchen wird, oder?

H
704 Beiträge seit 2003
vor 15 Jahren

Den Operator "===" gibt es nur in PHP und JavaScript und prüft, ob zwei Variablen vom selben Typ UND den selben Wert haben. Da es PHP ja nicht so genau nimmt mit den Datentypen, kann das manchmal gebraucht werden (mir fiele aber kein konkreter Anwendungsfall ein).

In C# und sonstigen streng typisierten Sprachen ist so ein Operator eh überflüssig.

[last.fm](http://www.last.fm/user/hauptmanAlpha/)
N
203 Beiträge seit 2008
vor 15 Jahren

Gibt ja Wertklassen wie Strukturen und Klassen sind Referenzklassen...

wenn du ne Klasse erstellst und auf nen zweiten Namen "kopierst":

Class klasse = new Class();
Class kopie = klasse;

Dann "kopie" ne neue Referenz auf die Class.

klass.Value = 1;
Console.WriteLine(kopie.Value.ToString()

Würde den Wert 1 geben, da es auf den gleichen Speicher zeigt.

Signatur.Text = "Greetz, Neals";

U
282 Beiträge seit 2008
vor 15 Jahren

Z.B. bei PHP gibt es diesen Operator.

Dort existiert keine Typsicherheit, daher kann es zu komischen Ergebnissen kommen.
Der Operator == bedeutet "gleicher Wert" (wie auch immer das zu interpretieren ist) und === bedeutet gleicher wert und gleicher typ.

Das hat relativ unabsehbare Konsequenzen. Denn warum "0" == 0 ist, ist mir noch klar, aber warum in der tat für jeden string string == 0 ist verstehe ich nicht.

Das kann man eben über den Operator === prüfen, dann ist nicht "0" === 0. Man muss aber auch hier aufpassen, denn es gilt auch nicht 0.0 === 0, weil 0.0 intern als double und 0 intern als int representiert werden, also verschiedene Typen haben.

Grüß,
Uwe

J
193 Beiträge seit 2007
vor 15 Jahren

In PHP braucht man den === selten, um zu überprüfen, ob eine boolsche Variable genau den Wert "true" hat. Denn in PHP steht zum Beispiel jeder Zahlenwert (außer 0) für true. Ich kann mich grob daran erinnern, dass es eine Funktion gibt, die entweder eine Zahl ausspruckt, oder false, wenn nichts gefunden wurde. Wenn man dort nur auf false überprüfen würde, wäre auch der legitime Wert 0 im einfachen Vergleich ( == ) false, aber nicht mit ===.

Aus dem Grund, anders als bei C#, sollte man boolsche Variablen auch mit

if ($variable == true)

abfragen, nicht nur mit if ($variable).

*Alle Angaben ohne Gewähr. Ist schon eine Weile her.

H
116 Beiträge seit 2008
vor 15 Jahren

Das ist zwar alles etwas OT, aber sei's drum, denn eigentlich ist es logisch:

Denn warum "0" == 0 ist, ist mir noch klar, aber warum in der tat für jeden string string == 0 ist verstehe ich nicht.

Es war einmal vor langer Zeit ein Compiler. Wenn man dort mit Hilfe der mitgelieferten Systembibliothek (Neudeutsch: Library) aus einer Zeichenkette eine Zahl extrahieren wollte, so wurde aus "0123test" vielleicht nicht ganz logisch, aber verständlich und bequem für den Programmierer 123. Und in der Konsequenz wurde das Ergebnis einer Zeichenkette, die keine Ziffern am Anfang enthielt, 0.

Die Entwickler von PHP haben das wohl übernommen, denn in der Konsequenz geht folgendes:
[php]
<?php
$testString1 = "0123test";
$testString2 = "test0123";
echo "$testString1 == 123 => " . (($testString1 == 123) ? "True" : "False") . "\n";
echo "$testString2 == 123 => " . (($testString2 == 123) ? "True" : "False") . "\n";
?>
[/php]
Die Ausgabe ist dann auch wie in diesem Kontext erwartet:


hd@lan:~> php -f test.php
$testString1 == 123 => True
$testString2 == 123 => False
hd@lan:~>

Dieser völlig verwahrloste Umgang mit Datentypen hat dann einige Entwickler wohl dazu getrieben, zumindest Elemente in die Sprache zu bringen, die Typenschärfe zeigen, wenn sie schon nicht strenge Typen insgesamt durchsetzen können. Und so entstanden dann eben die (imho) sehr hilfreichen Operatoren \=== und !==.

(mir fiele aber kein konkreter Anwendungsfall ein)

Nun, PHP ist eine Skriptsprache, bei der man es mit Typen nicht so genau nimmt. Warum auch? Es geht doch darum, schnell einen Batch On The Fly zu erledigen. Und die mit PHP zusammengeschraubte Web-Site nutzt intensiv Zeichenketten, vor allem aus dem Array $_REQUEST. Da ich mal davon gehört habe, dass es sinnvoll sein könnte, Variablen aus diesem Array einer etwas gründlicheren Prüfung zu unterziehen (keine Ahnung, wieso eigentlich), bleibt einem kaum eine Funktion wie strpos erspart. Die liefert aber $needle aus dem Heuhaufen als 0-basierten Index und FALSE wenn der Heuhaufen doch nicht pikt. Und ich könnte mir vorstellen, dass die Erkennung einer Zeichenkette wie "; DROP TABLE ..." durchaus für den einen oder anderen von einem gewissen, wenngleich untergeordnetem Interesse sein könnte...

In C# und sonstigen streng typisierten Sprachen ist so ein Operator eh überflüssig.

Eben.

5.941 Beiträge seit 2005
vor 15 Jahren

Hallo zusammen

wenn du ne Klasse erstellst und auf nen zweiten Namen "kopierst":

Class klasse = new Class();  
Class kopie = klasse;  

Dann "kopie" ne neue Referenz auf die Class.

Beide Variabeln halten die gleiche Referenz auf das gleiche Objekt, ja.

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo Peter Bucher,

Beide Variabeln halten die gleiche Referenz auf das gleiche Objekt, ja.

auf dasselbe Objekt. 🙂 In dem Thread geht es ja unter anderem auch um den Unterschied zwischen das gleiche und dasselbe.

herbivore

5.941 Beiträge seit 2005
vor 15 Jahren

Hallo herbivore

Beide Variabeln halten die gleiche Referenz auf das gleiche Objekt, ja.
auf dasselbe Objekt. 🙂 In dem Thread geht es ja unter anderem auch um den Unterschied zwischen das gleiche und dasselbe.

Ja klar, das ist eine Frage der Interpretation.
Korrekt und unmissverständlich in diesem Kontext wäre natürlich schon "dasselbe" 🙂

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

H
704 Beiträge seit 2003
vor 15 Jahren

OT aber ...

Nun, PHP ist eine Skriptsprache, bei der man es mit Typen nicht so genau nimmt. Warum auch? Es geht doch darum, schnell einen Batch On The Fly zu erledigen. Und die mit PHP zusammengeschraubte Web-Site nutzt intensiv Zeichenketten, vor allem aus dem Array $_REQUEST. Da ich mal davon gehört habe, dass es sinnvoll sein könnte, Variablen aus diesem Array einer etwas gründlicheren Prüfung zu unterziehen (keine Ahnung, wieso eigentlich), bleibt einem kaum eine Funktion wie strpos erspart. Die liefert aber $needle aus dem Heuhaufen als 0-basierten Index und FALSE wenn der Heuhaufen doch nicht pikt. Und ich könnte mir vorstellen, dass die Erkennung einer Zeichenkette wie "; DROP TABLE ..." durchaus für den einen oder anderen von einem gewissen, wenngleich untergeordnetem Interesse sein könnte...

Niemand würde in PHP eine SQL Injection zu Fuß ausprogrammieren. Gibt nicht umsonst mysql_real_escape_string ... aber grundsätzlich natürlich richtig, was du schreibst, nur ist der "===" Operator in PHP wirklich von recht geringer praktischer Bedeutung.

[last.fm](http://www.last.fm/user/hauptmanAlpha/)