Heim >Backend-Entwicklung >C++ >Warum wurde „i = i 1;' in C 17 zu einer legitimen Operation?

Warum wurde „i = i 1;' in C 17 zu einer legitimen Operation?

Susan Sarandon
Susan SarandonOriginal
2024-10-29 03:19:021046Durchsuche

Why Did

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn