Unterschied zwischen i++ und (i)++ in C

Lesezeit: 3 Minuten

Benutzeravatar von Polaris000
Polaris000

int i = 3;
int j = (i)++;

vs

int i = 3;
int j = i ++;

Gibt es einen Unterschied zwischen der Bewertung der beiden oben genannten Fälle?

Ist der erste Fall gleichbedeutend mit dem Erhöhen eines rvalue oder handelt es sich um ein undefiniertes Verhalten?

  • Die scheinbar willkürliche Verwendung von Klammern ist in Makrodefinitionen üblich. Wo sie tun einen großen Unterschied machen, möchten Sie die Fehlermeldung, die Sie erhalten. Nun, normalerweise.

    – Hans Passant

    27. Februar 2019 um 16:38 Uhr

  • Es gibt keinen Unterschied zu denen für ints. Es ist jedoch nicht immer der Fall und Sie müssen vorsichtig sein, wenn Sie Klammern und Operatoren kombinieren, @govin-parmar hat ein gutes Beispiel gezeigt, was mit Zeigern passieren kann.

    – Tomasz Kornuta

    28. Februar 2019 um 3:20 Uhr

  • Deutlich sein, beide dieser Fälle sind wohldefiniert (d. h. nicht UB) und speichern 3 Zoll j.

    – osuka_

    28. Februar 2019 um 15:09 Uhr

  • überdenke ich es” Jawohl.

    – alk

    5. März 2019 um 20:10 Uhr

Benutzeravatar von Eric Postpischil
Eric Postpischil

i++ und (i)++ verhalten sich identisch. C 2018 6.5.1 5 sagt:

Ein eingeklammerter Ausdruck ist ein primärer Ausdruck. Sein Typ und Wert sind identisch mit denen des ungeklammerten Ausdrucks. Es ist ein Lvalue, ein Funktionsbezeichner oder ein void-Ausdruck, wenn der Ausdruck ohne Klammern ein Lvalue, ein Funktionsbezeichner oder ein void-Ausdruck ist.

Der Wortlaut ist derselbe in C 1999.

  • Der Vollständigkeit halber, war das schon immer so? Ich meine, ich weiß, dass es so ist, aber Ihre Referenz sagt C 2018 (dh die neueste Version), also kann es nicht schaden, es ausgeschrieben zu haben.

    – Herr Lister

    28. Februar 2019 um 7:17 Uhr

  • @MrLister Ja, sogar vor ANSI C (1978) hatte dieses Verhalten. Es ist nicht formell ausgeschrieben (so wenig war), aber es ist für einige Beispiele in der ersten Ausgabe von K&R erforderlich, wie z (*ptr)++.

    – Sneftel

    28. Februar 2019 um 9:10 Uhr


Benutzeravatar von Govind Parmar
Govind Parmar

In Ihrem einfachen Beispiel von i++ gegen (i)++gibt es keinen Unterschied, wie in der Antwort von Eric Postpischil angegeben.

Dieser Unterschied ist jedoch tatsächlich sinnvoll, wenn Sie eine Zeigervariable mit dereferenzieren * -Operator und Verwendung des Inkrementoperators; es gibt einen unterschied zwischen *p++ und (*p)++.

Die erstgenannte Anweisung dereferenziert den Zeiger und erhöht dann den Zeiger selbst; die letztere Anweisung dereferenziert den Zeiger und erhöht dann den dereferenzierten Wert.

  • Also zum Beispiel, wenn Sie ein Makro definieren #define postinc(x) x++ dann postinc(*p) wird angesichts der funktionsähnlichen Notation nicht das tun, was Sie erwarten. Deshalb ist es beim Schreiben von Makros üblich, stark Klammern zu setzen, z #define postinc(x) ((x)++)

    – Daniel Schepler

    28. Februar 2019 um 1:12 Uhr

  • Ihre Antwort läuft darauf hinaus, dass “Klammern verwendet werden können, um den Vorrang des Operators zu erzwingen”, was offensichtlich ist und nicht das, was das OP gefragt hat.

    – Giacomo Alzetta

    28. Februar 2019 um 9:53 Uhr

  • @GiacomoAlzetta Es gab eine lange Diskussion zu dieser Antwort, die durch Moderation entfernt wurde. Kurz gesagt, ich hielt es für wichtig, diese spezielle Nuance zu erklären, da das Verwechseln dieser beiden Ausdrücke eine häufige Quelle von Fehlern für Anfänger in C ist.

    – Govind Parmar

    28. Februar 2019 um 12:05 Uhr

  • @GiacomoAlzetta Denken Sie daran, dass SO-Antworten für jeden nützlich sein sollen, der die Frage liest, nicht nur für das OP oder für Personen, die bereits mit der Technologie vertraut sind, nach der gefragt wird. Nach meiner Erfahrung ist die häufigste Verwendung von (expr)++ besteht darin, einen dereferenzierten Wert zu erhöhen, um Anfängern den Eindruck zu vermitteln, dass dies der Fall ist expr++ gleichwertig ist, ist nachteilig.

    – Govind Parmar

    28. Februar 2019 um 12:12 Uhr

  • @SolomonUcko Nein, der erste würde den Zeiger dereferenzieren und ihn dann erhöhen. Die zweite würde den Zeiger erhöhen und DANN dereferenzieren.

    – Ale10ander

    28. Februar 2019 um 20:21 Uhr

1410230cookie-checkUnterschied zwischen i++ und (i)++ in C

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy