Verständnisproblem mit pre-increment

BAGZZlash

Moderator
Teammitglied
Ich habe einen JS-Code, den ich portieren will. Dabei habe ich aber Verständnisprobleme mit multiplen Zuweisungen innerhalb einer Zeile in einem Increment-Präfix. Die betreffende Zeile lautet:

Javascript:
lastX = x[currentRow] = (x0[currentRow] + a * (lastX + x[++currentRow] + x[++lastRow] + x[++nextRow])) * invC;

Zunächst einmal gibt's da die Zuweisung an lastX und die Zuweisung an x[currentRow]. Ich denke, das wird von rechts nach links geparst, oder? Also müsste a = b = c; identisch sein mit

Javascript:
b = c;
a = b;

richtig? Als nächstes werden dort die Array-Indizes inkrementiert, und zwar vor der Verwendung. Nach welcher Reihenfolge wird das ausgeführt?

Ich komme hier echt durcheinander. Letztlich habe ich versucht, die Zeile:

Javascript:
lastX = x[currentRow] = (x0[currentRow] + a * (lastX + x[++currentRow] + x[++lastRow] + x[++nextRow])) * invC;

mal zu übertragen in eine Version für Dreijährige:

Javascript:
x[currentRow] = (x0[currentRow] + a * (lastX + x[currentRow + 1] + x[lastRow + 1] + x[nextRow + 1])) * invC;
lastX = x[currentRow];
currentRow = currentRow + 1;
lastRow = lastRow + 1;
nextRow = nextRow + 1;

aber das macht definitiv nicht dasselbe wie der Ursprungscode. Kann mir jemand den Knoten im Hirn lösen?
 
Ah, ich glaube, ich hab' eine Variante. Ist das so okay?

Javascript:
x[currentRow] = (x0[currentRow] + a * (lastX + x[currentRow + 1] + x[lastRow] + x[nextRow])) * invC;
lastX = x[currentRow];
currentRow = currentRow + 1;
lastRow = lastRow + 1;
nextRow = nextRow + 1;
 
Den einzigen Unterschied, den ich jetzt sehe ist, dass du die letzten beiden + 1 in der ersten Zeile entfernt hast. Ist das richtig? Deine Annahmen sind soweit alle richtig. D. h. dass deine erste Version mit deiner Kurzfassung durchaus identisch sein müsste. Es müssten alle drei Indizes inkrementiert werden, bevor die Zuweisung stattfindet.
So ist es leider nur schwer nachvollziehbar, was genau passieren müsste und was wirklich passiert.

Aber eine Frage der Vorsicht halber: Du deklarierst deine Variablen in deinem echten Code schon, oder (var, let, const)? In der Form, wie du es hier schreibst, kann es sonst potenziell sein, dass sich der Code selbst in die Quere kommt, weil das globale Variablen wären.
 
Danke Euch beiden. Deklariert ist alles, klar. Der Code stammt von hier, bei der fraglichen Zeile geht es um die Funktion lin_solve() in der Datei "pressure.js".

Kann ich mir nicht vorstellen. Das führt das Pre-Increment für lastRow und nextRow ad absurdum.
Stimmt. Also muss das so, ja?

Javascript:
lastRow = lastRow + 1;
nextRow = nextRow + 1;
x[currentRow] = (x0[currentRow] + a * (lastX + x[currentRow + 1] + x[lastRow] + x[nextRow])) * invC;
lastX = x[currentRow];
currentRow = currentRow + 1;

Oder wie? Wann genau ist currentRow "eins mehr"?
 
Ja, so könnte man das auch schreiben. In den eckigen Klammern muss die Incrementation schon erfolgt sein. Theoretisch kann bei diesen beiden Variablen also das Pre-Increment auch stehen bleiben. Sofern die Sprache in die du den Code portieren willst den ++Operator unterstützt, versteht sich. Lediglich das Pre-Increment bei currentRow macht im Zweifelsfall Probleme. In C oder C++ erzeugt das definitiv undefiniertes Verhalten.
 
Zurück
Oben Unten