Zwei Gleichheitszeichen in einer Zeile?

Lesezeit: 4 Minuten

Könnte jemand bitte erklären, was das tut und wie es legaler C-Code ist? Ich habe diese Zeile in diesem Code gefunden: http://code.google.com/p/compression-code/downloads/listdie eine C-Implementierung des Vitter-Algorithmus für ist Adaptive Huffman-Codierung

ArcChar = ArcBit = 0;

Aus der Funktion:

void arc_put1 (unsigned bit)
{
    ArcChar <<= 1;

    if( bit )
        ArcChar |= 1;

    if( ++ArcBit < 8 )
        return;

    putc (ArcChar, Out);
    ArcChar = ArcBit = 0;
}

ArcChar ist ein int und ArcBit ist ein unsigned char

Benutzer-Avatar
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

Benutzer-Avatar
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

Benutzer-Avatar
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.


1 x = 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.

1256930cookie-checkZwei Gleichheitszeichen in einer Zeile?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy