ArcChar ist ein int und ArcBit ist ein unsigned char
Joey
Der Wert des Ausdrucks (a = b) ist der Wert von b, damit Sie sie auf diese Weise verketten können. Sie sind auch rechtsassoziativ, also klappt alles.
Im Wesentlichen
ArcChar = ArcBit = 0;
ist circa1) das Gleiche wie
ArcBit = 0;
ArcChar = 0;
da der Wert der ersten Zuweisung der zugewiesene Wert ist, also 0.
In Bezug auf die Typen, obwohl ArcBit ist ein unsigned char das Ergebnis der Aufgabe wird erweitert int.
1 Es ist nicht exakt das gleiche jedoch, wie R.. in einem Kommentar unten betont.
Vielen Dank für die Erklärung des Datentypproblems.
– Benutzer807566
30. August 2011 um 13:52 Uhr
Es ist nicht ganz dasselbe wie die Version mit zwei Anweisungen, die einen Sequenzpunkt zwischen den beiden Aufgaben hat. Dies kann einen Unterschied machen, wenn die beiden lvalues sind *ptr1 und *ptr2 und sie zeigen zufällig auf dieselbe Stelle (in der die Version mit einer Anweisung UB hätte) oder ob sie beide sind volatile und Sie kümmern sich um die Reihenfolge, in der die Aufgaben ausgeführt werden.
– R.. GitHub HÖR AUF, EIS ZU HELFEN
30. August 2011 um 17:55 Uhr
Ach, verdammt. Und jetzt kann ich nicht löschen :-/
– Joey
30. August 2011 um 19:00 Uhr
@R .. könnten Sie bitte näher darauf eingehen, ob es sich bei beiden um Zeiger handelt? Ich verstehe nicht, wie wichtig das wäre, wenn *ptr1 = *ptr2 = 0;…und was meinst du damit UB?
– Michel Feinstein
22. August 2016 um 4:43 Uhr
(UB steht für Undefined Behaviour, ich verstehe es jetzt)
– Michel Feinstein
22. August 2016 um 18:02 Uhr
ArcChar = ArcBit = 0;
Die Zuweisung ist linksassoziativ, also äquivalent zu:
ArcChar = (ArcBit = 0);
Das Ergebnis von ArcBit = 0 ist der neu angenommene Wert, das heißt – 0also ist es sinnvoll, das zuzuweisen 0 zu ArcChar
Es setzt beide Variablen auf Null.
int i, j;
i = j = 0;
Das gleiche wie beim Schreiben
int i, j;
j = 0;
i = j;
oder Schreiben
int i, j;
i = 0;
j = 0;
Das ist nur eine Verkettung des Zuweisungsoperators. Die Norm sagt in 6.5.16 Assignment operators:
Ein Zuweisungsoperator muss als linken Operanden einen modifizierbaren lvalue haben. Ein Zuweisungsoperator speichert einen Wert in dem durch den linken Operanden bezeichneten Objekt. Ein Zuweisungsausdruck hat den Wert des linken Operanden nach der Zuweisung, ist aber kein L-Wert. Der Typ eines Zuweisungsausdrucks ist der Typ des linken Operanden, es sei denn, der linke Operand hat einen qualifizierten Typ, in diesem Fall ist es die nicht qualifizierte Version des Typs des linken Operanden. Der Nebeneffekt des Aktualisierens des gespeicherten Werts des linken Operanden soll zwischen dem vorherigen und dem nächsten Sequenzpunkt auftreten.
Sie können also Folgendes tun:
a=b=2; // ok
Aber nicht das:
a=2=b; // error
Eine Zuweisungsoperation (a = b) selbst gibt einen Rvalue zurück, der weiter einem anderen Lvalue zugewiesen werden kann; c = (a = b). Am Ende haben sowohl a als auch c den Wert von b.
Interessant. Ich wusste nicht, dass es einen Wert zurückgibt. Vielen Dank.
– Benutzer807566
30. August 2011 um 13:46 Uhr
Hasturkun
Es weist zu ArcBit zu 0weist dann zu ArcChar zum Wert des Ausdrucks ArcBit = 0 (dh. 0)
Interessant. Ich wusste nicht, dass es einen Wert zurückgibt. Vielen Dank.
– Benutzer807566
30. August 2011 um 13:46 Uhr
Jeremy
In einigen Sprachen sind Aufgaben Aussagen: Sie bewirken, dass eine Aktion stattfindet, aber sie haben selbst keinen Wert. Zum Beispiel in Python1 es ist verboten zu schreiben
x = (y = 10) + 5
weil die aufgabe y = 10 kann nicht verwendet werden, wenn ein Wert erwartet wird.
C ist jedoch eine von vielen Sprachen, in denen Zuweisungen enthalten sind Ausdrücke: Sie produzieren einen Wert sowie alle anderen Effekte, die sie haben könnten. Ihr Wert ist der Wert, der zugewiesen wird. Die obige Codezeile wäre in C zulässig.
Die Verwendung von zwei Gleichheitszeichen in einer Zeile wird wie folgt interpretiert:
ArcChar = (ArcBit = 0);
Das ist: ArcChar wird der Wert von zugewiesen ArcBit = 0welches ist 0also sind beide Variablen am Ende 0.
1x = y = 0 ist eigentlich in Python erlaubt, aber es wird als Sonderfall der Zuweisungsanweisung angesehen, und der Versuch, irgendetwas Komplizierteres mit Zuweisungen zu machen, wird fehlschlagen.
12569300cookie-checkZwei Gleichheitszeichen in einer Zeile?yes