Heim >Backend-Entwicklung >C++ >Ist „i = i' in C immer undefiniertes Verhalten?

Ist „i = i' in C immer undefiniertes Verhalten?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-07 03:00:11935Durchsuche

Is `i  =   i` Always Undefined Behavior in C  ?

Undefiniertes Verhalten und Sequenzpunkte überarbeitet

Undefiniertes Verhalten für integrierte Typen

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.

Undefiniertes Verhalten für benutzerdefinierte Typen

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?

Gut definiertes Verhalten für überlastete Operatoren

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

Undefiniertes Verhalten für a[ i] = i

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 .

Gut definiertes Verhalten für i

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!

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