Verständnisproblem mit pre-increment

BAGZZlash

Neues Mitglied
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?
 

BAGZZlash

Neues Mitglied
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;
 

alinnert

Mitglied
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.
 

BAGZZlash

Neues Mitglied
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"?
 

german

Aktives Mitglied
devCommunity-Experte
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.
 

BAGZZlash

Neues Mitglied
Sofern die Sprache, in die du den Code portieren willst, den ++Operator unterstützt, versteht sich.
Im Moment portiere ich nach VB, später dann nach R. In beiden Sprachen gibt's nur die Dreijährigennotation, was auch deutlich besser zum kleinen BAGZZlash passt... 😇 Danke.
 
Oben Unten