Ist C# a=b=c, gleich b=c; a=c; in der Erwägung, dass C++ ist b=c; a=b;?
In anderen Worten, C# - operator= wird es wieder den richtigen Wert, nicht wahr? Aber C++ konventionell gibt Links Wert, oder?
- Ich vermeide diese syntax genau aus diesem Grund - es sollte sofort ersichtlich sein, was Ihr code tut.
- 1) Es geschieht nicht so. 2) Auch er wusste, was das unterschiedliche Verhalten könnte möglicherweise Ergebnis?
- Keine Ahnung, aber
a = c; b = c;
(wenn geschrieben, auf zwei Zeilen) vermeidet auch Gedanken über eventuelle Mehrdeutigkeit und macht es offensichtlich, dass es zwei Zuordnung. - vermutlich zwei
=
schlägt vor, zwei Aufträge? (und für was es Wert ist, der Vergleich sollte mitb = c; a = b
. - Was ist, wenn A, B und C sind alle proprties und was ist, wenn Sie auch verschiedene Arten mit implictly overided wirft - was Getter / setter sind genannt und was wirft Sie geltend gemacht werden? Ich sage nicht, dass Sie nicht arbeiten kann, es heraus (oder auch, dass es schwierig ist), nur, dass zwei einfache Aufgaben sollten nicht mit dieser Art von geistiger Aufwand. Es gibt bereits 4 verschiedene Antworten auf diese Frage (eine davon ist falsch!)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein, das Ergebnis der Zuordnung Ausdrucks ist der zugewiesene Wert, nicht der Ausdruck auf der rechten Seite. Beachten Sie daher Folgendes:
Diese nicht kompiliert werden, weil, obwohl
b = c
gültig ist, es ist ein Ausdruck vom Typint
, die dann nicht zugeordnet werdena
die den Typbyte
.Aus der C# 4 Sprach-Spezifikation, Abschnitt 7.17.1:
EDIT: Hier der Beweis, dass es den Wert, der zugewiesen wurde, um
b
genutzt wird nicht der Wertc
:Den
a = b = c;
- Anweisung ist äquivalent zu:Also der Wert von
b
ist nicht Lesen danach (es ist nicht äquivalent zub = c; a = b;
) - also, wennb
waren eigentlich eine Eigenschaft, die das Verhalten der Immobilie wäre irrelevant als für Nebenwirkungen. Es ist was auch immer Wert in der Zuordnung zub
das ist auch in der Zuordnung zua
.In diesem Fall, die Zuordnung zu
b
erfordert eine Umwandlung vonACType
zuBType
schafft einenBType
mit Wert=50. Die Zuordnung zua
werden, dann muss eine Konvertierung vonBType
zuACType
, das schafft einACType
mit Wert=25.a = b
gültig ist... Du meinstb = a
?a = b = c
Aussehen kann gar nichts, wie der Wert von beliebiger der Variablen, die hier, die können gar nicht gleich sein. Teil von diesem wusste ich, Teil dieses Sie hat mir geholfen, zu lernen, und die meisten von ist es ich hoffe, dass ich nie wirklich haben zu prüfen, die in meinem coding-Aktivitäten.Nein, es funktioniert auf die gleiche in beiden Sprachen:
a = b = c;
funktioniert wie folgt:a = (b = c);
. Der Zuweisungsoperator arbeitet von rechts nach Links, und der zurückgegebene Wert ist das Ergebnis der Zuordnung, das ist der Links-hand-Seite. So konzeptionella = b = c;
ist das gleiche wie:b = c; a = b;
.Für C#, die Zuweisungsoperatoren und der bedingte operator (?:) sind rechts-assoziativ, was bedeutet, dass die Operationen sind von rechts nach Links durchgeführt. Zum Beispiel x = y = z ausgewertet als x = (y = z). (Quelle)
Gleiche für C++ (Quelle)
b
. Ich komme mit ein Beispiel.Nützliche Leckerbissen über die Semantik von
a = b = c
ist, dassa
wird in der Tat erhalten den gleichen Wert (normalerweisec
*) das war zugeordnet zub
, die vorhanden Wert vonb
ist nicht ein Faktor.Ja, das könnte als überraschend. Betrachten Sie das Beispiel:
Wenn der übergebene Wert durch
foo.Bar
und die mutation folgt ina
, danna
wäre 5. Das ist aber nicht das, was passiert.a
undfoo.Bar
erhalten den gleichen Wert,a
erhält nicht die mutation vonfoo.Bar
. Es ist nicht direkt deine Frage, aber es ist interessant genug, um post-Prüfung einige der Kommentare.*Jon Skeet hatte eine interessante Beobachtung über die Arten, die implizit Cabrio zu einander, sondern haben Datenverlust/- änderung bei der Umwandlung. In diesem Fall kann der Wert sehr gut nicht der ursprüngliche Wert, der
c
, aber der konvertierte Wert, welcher ein anderer sein kann.c
. Stellen Sie sich die zwei Typen, die implizite Konvertierungen in die jeweils andere, aber Daten verlieren, woa
undc
sind eine Art, undb
ist der andere Typ. Die Umwandlung von der Art derc
auf die Art derb
durchgeführt würden, dann ist die Konvertierung zurück zu der Art vona
durchgeführt würden.