Warum i = i 1; Wurde in C 17 legal
In C 11 wurde das Codefragment „i = i 1;“ undefiniertes Verhalten aufgerufen. In C 17 wurde dieser Kodex jedoch rechtlich zulässig. Diese Änderung ergibt sich aus den in C 17 eingeführten erweiterten Sequenzierungsgarantien.
Gemäß dem C 11-Standard [N3337 basic.exec] ist die Sequenzierung von Nebenwirkungen nicht sequenziert, sofern nicht ausdrücklich angegeben. Im Beispielcode haben der Zuweisungsoperator (=) und der Postfix-Inkrementoperator ( ) beide Nebenwirkungen, die bei falscher Reihenfolge zu undefiniertem Verhalten führen können.
In C 17 wurde ein neuer Satz zu [ hinzugefügt N4659 expr.ass], der die Reihenfolgeregeln für den Zuweisungsoperator verdeutlicht:
The right operand is sequenced before the left operand.
Diese zusätzliche Anweisung stellt sicher, dass alle Nebenwirkungen innerhalb des rechten Operanden vor allen Nebenwirkungen innerhalb des linken Operanden ausgeführt werden, einschließlich der Zuweisung selbst.
Im Fall von „i = i 1;“ besteht der rechte Operand (i 1) aus dem Postfix-Inkrementoperator (i ) und der Konstante 1. Dafür sorgen die in C 17 eingeführten Sequenzierungsgarantien Die Postfix-Inkrementierung wird durchgeführt und ihr Nebeneffekt tritt auf, bevor die Zuweisung ausgeführt wird. Dadurch wird das undefinierte Verhalten beseitigt, das in C 11 vorhanden war.
Daher haben die erweiterten Sequenzierungsgarantien in C 17 „i = i 1;“ ergeben. legal, indem sichergestellt wird, dass die Nebenwirkungen der rechten und linken Operanden korrekt sequenziert sind, wodurch undefiniertes Verhalten verhindert wird.
Das obige ist der detaillierte Inhalt vonWarum wurde „i = i 1;' in C 17 zu einer legitimen Operation?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!