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
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
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
14102300cookie-checkUnterschied zwischen i++ und (i)++ in Cyes
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