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

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

Patricia Arquette
Freigeben: 2024-12-07 03:00:11
Original
880 Leute haben es durchsucht

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;
Nach dem Login kopieren

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;
        }
};
Nach dem Login kopieren

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++();
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage