Legalität von i = i 1 in C 17
C 17 führte eine subtile, aber bedeutende Änderung ein, die den Ausdruck i = i 1 legalisierte; , was zuvor in C 11 ein undefiniertes Verhalten war.
Vor C 17
In C 11 wurde die Auswertungsreihenfolge eines Zuweisungsausdrucks wie folgt angegeben:
Im Fall von i = i 1; bedeutete dies, dass der Nebeneffekt der Inkrementierung von i mithilfe des Postfix-Operators vor oder nach der Zuweisung auftreten konnte. Dieser Mangel an Sequenzierung führte zu undefiniertem Verhalten.
Änderungen in C 17
C 17 führte einen zusätzlichen Satz zur Spezifikation des Zuweisungsoperators ein: „Der rechte Operand ist vor dem linken Operanden sequenziert. Dieser scheinbar harmlose Zusatz hat weitreichende Auswirkungen.
Durch die Sequenzierung des RHS vor dem LHS stellt C 17 nun sicher, dass etwaige Nebenwirkungen im RHS garantiert vor der eigentlichen Zuordnung auftreten. Dadurch wird die Zuweisungsaktion effektiv von jeglichem potenziell undefinierten Verhalten isoliert.
Das Beispiel neu schreiben
Um diese Änderung zu veranschaulichen, lassen Sie uns die Auswertung von i = i 1; in C 17:
Wertberechnung des rechten Operanden (RHS): i 1
Reihenfolge von RHS vor LHS:
Wertberechnung des linken Operanden (LHS): i
Zuweisung:
Indem Sie sicherstellen, dass alle Nebenwirkungen berücksichtigt sind Wenn die RHS der Zuweisung vorangeht, schließt C 17 die Möglichkeit eines undefinierten Verhaltens in solchen Ausdrücken endgültig aus.
Das obige ist der detaillierte Inhalt vonIst „i = i 1' in C 17 gesetzlich definiert?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!