In einer früheren Folge, „Undefiniertes Verhalten und Sequenzpunkte“, Wir haben das mögliche undefinierte Verhalten besprochen, das damit verbunden ist Ausdruck:
i += ++i;
Wenn i ein integrierter Typ ist, ruft dieser Ausdruck undefiniertes Verhalten auf, da das Objekt i zwischen aufeinanderfolgenden Sequenzpunkten zweimal geändert wird.
Wenn es sich bei i jedoch um einen benutzerdefinierten Typ handelt, z. B. um die definierte Indexklasse unten:
class Index { int state; public: Index(int s) : state(s) {} Index& operator++() { state++; return *this; } Index& operator+=(const Index & index) { state+= index.state; return *this; } operator int() { return state; } Index & add(const Index & index) { state += index.state; return *this; } Index & inc() { state++; return *this; } };
Würde der Ausdruck i = i immer noch undefiniertes Verhalten hervorrufen?
Überraschenderweise nein. Ausdruck i = i mit einem benutzerdefinierten Typ i ruft kein undefiniertes Verhalten auf, da überladene Operatoren in C als Funktionen betrachtet werden. Gemäß Abschnitt 1.9.17 des C-ISO-Standards:
Beim Aufrufen einer Funktion (unabhängig davon, ob die Funktion inline ist oder nicht) gibt es nach der Auswertung aller Funktionsargumente einen Sequenzpunkt...
Daher führen die Aufrufe der Funktionen „operator“ und „operator =“ Sequenzpunkte ein und verhindern so undefiniertes Verhalten.
Der Ausdruck a[ i] = i ist auch dann wohldefiniert, wenn a ein benutzerdefinierter Typ mit einem überladenen Indexoperator ist, da er nach der Auswertung des i-Ausdrucks als Funktionsaufruf mit einem Sequenzpunkt betrachtet wird .
In C 03 ist der Ausdruck i wohldefiniert, da er effektiv äquivalent ist zu:
((i.operator++()).operator++()).operator++();
Mit jedem Funktionsaufruf wird ein Sequenzpunkt eingeführt, wodurch der Ausdruck klar definiert wird.
Das obige ist der detaillierte Inhalt vonIst „i = i' in C immer undefiniertes Verhalten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!