Was bedeutet =+ in C?

Lesezeit: 3 Minuten

mugetsus Benutzeravatar
mugetsu

Ich bin gestoßen =+ im Gegensatz zum Standard += heute in irgendeinem C-Code; Ich bin mir nicht ganz sicher, was hier los ist. In der Dokumentation habe ich es auch nicht gefunden.

  • Funktioniert dieser Codeabschnitt wie erwartet? Wenn nicht, kann das ein Tippfehler sein.

    – Markus Jones

    27. September 2011 um 18:33 Uhr

  • @TimCooper ziemlich sicher, es sind viele Zeilen und der Code lässt sich gut kompilieren. Ich verwende Microsoft Visual Studios

    – Mugetsu

    27. September 2011 um 18:33 Uhr

  • @SteveRowe: VS (wie jeder Compiler seit der Abkühlung der Erde) behandelt es als = (+).

    – Jerry Sarg

    27. September 2011 um 22:02 Uhr

  • Ich kann einfach nicht verstehen, warum diese interessanten – aber im Grunde trivialen, reinen Unterhaltungsfragen – immer viel Aufmerksamkeit (und „Daumen hoch“) bekommen Dutzende von identisch Antworten, während bei ernsthaften Fragen oft die Frage ignoriert und 0 Antworten gegeben werden. Die Beantwortung trivialer Fragen erfordert keine Anstrengung. Lassen Sie uns die schwierigen beantworten.

    – gd1

    28. September 2011 um 14:26 Uhr


  • @gd1: Es ist vielleicht der größte Fehler im StackExchange-Modell. Solche Fragen sind nicht nur beliebt, sie widersprechen normalerweise der Richtlinie, dass Fragen „auf tatsächlichen Problemen basieren sollten, mit denen Sie konfrontiert sind“ (FAQ), wodurch die Richtlinie in lächerlichem Widerspruch zur tatsächlichen Nutzung der Website durch die Community steht. Kurz gesagt, die am wenigsten nützlichen Fragen erhalten die höchste Punktzahl – genau das Gegenteil des Zwecks der Abstimmung. Ich habe dies auf Meta angesprochen, wurde aber abgeschossen.

    – Igby Largeman

    26. Oktober 2011 um 18:51 Uhr

Benutzeravatar von Jerry Coffin
Jerry Sarg

Im alt Versionen von C, =+ war gleichwertig +=. Überreste davon wurden neben den frühesten Dinosaurierknochen gefunden.

Zum Beispiel führte B verallgemeinerte Zuweisungsoperatoren ein, using x+=y hinzufügen y zu x. Die Notation stammt von Algol 68 über McIlroy, der sie in seine Version von TMG aufgenommen hat. (In B und frühen C wurde der Operator geschrieben =+ Anstatt von +=; Dieser Fehler, der 1976 behoben wurde, wurde durch eine verführerisch einfache Art der Handhabung der ersten Form in Bs lexikalischem Analysator verursacht.)

[The Development of the C Language, Dennis Ritchie. Copyright ACM, 1993. Internal citations omitted.]

Seit Mitte der 1970er Jahre hat es keine besondere Bedeutung mehr – es ist nur ein = gefolgt von einem +.

  • Aber es wird nicht mehr unterstützt, weil es mit unary + mehrdeutig ist.

    – Paul Tomblin

    27. September 2011 um 18:34 Uhr

  • das kann ich bestätigen =+ war ursprünglich die gleiche wie die aktuelle +=. Ich erinnere mich nicht, ob beide von Anfang an gültig waren oder =+ war zunächst die einzige Option, wurde aber aufgrund der Unklarheit (zu Recht) auf jeden Fall fallen gelassen.

    – Heiße Licks

    27. September 2011 um 18:48 Uhr

  • Es war vielleicht nur eine VAX-Sache, aber ich schwöre, mir wurde beigebracht, dass += ein Präinkrement und =+ ein Postinkrement war, was, wie ich mich erinnere, fast immer genau dasselbe ist … aber nicht in komplexen Fragen der Betriebsreihenfolge.

    – Eric Brown-Kal

    27. September 2011 um 21:38 Uhr

  • @markgz: siehe Seite 5 von Dennis Papier (Warnung: Nachtrag) zur Geschichte von C.

    – Jerry Sarg

    27. September 2011 um 21:56 Uhr


  • Danke, Jerry. Für Interessierte heißt es in der Zeitung zu “=+”: “…dieser Fehler, repariert 1976…”. 1976 war vor meiner Zeit.

    – markgz

    27. September 2011 um 23:22 Uhr

Benutzeravatar von Jonathan Leffler
Jonathan Leffler

Hinweise auf die alte Schreibweise finden Sie im UNIX-Handbuch 7. Ausgabe (Band 2a) vom Januar 1979, online verfügbar unter http://cm.bell-labs.com/7thEdMan/ (seit etwa Juli 2015 nicht mehr verfügbar; die Version vom Juni 2015 ist jetzt über die WayBack Machine unter verfügbar http://cm.bell-labs.com/7thEdMan/ – oder bei https://9p.io/7thEdMan/).

Das Kapitel trägt den Titel ‘C Referenzhandbuch‘ von Dennis M. Ritchie und befindet sich in der PDF-Version des Handbuchs, aber nicht in der HTML-Version. An der entsprechenden Stelle heißt es:

7.14.1 lvalue = Ausdruck

Der Wert des Ausdrucks ersetzt den des Objekts, auf das der lvalue verweist. Die Operanden müssen nicht denselben Typ haben, aber beide müssen int, char, float, double oder pointer sein. Wenn keiner der Operanden ein Zeiger ist, erfolgt die Zuweisung wie erwartet, möglicherweise mit vorangegangener Konvertierung des rechten Ausdrucks. Wenn beide Operanden int oder Zeiger irgendeiner Art sind, findet niemals eine Konvertierung statt; Der Wert des Ausdrucks wird einfach in dem Objekt gespeichert, auf das der lvalue verweist. Somit ist es möglich, Zeiger zu generieren, die bei Verwendung Adressierungsausnahmen verursachen.

7.14.2 lvalue =+ Ausdruck
7.14.3 lvalue =- Ausdruck
7.14.4 lvalue =* Ausdruck
7.14.5 lvalue =/ Ausdruck
7.14.6 lvalue = %-Ausdruck
7.14.7 lvalue =>> Ausdruck
7.14.8 lvalue =<< Ausdruck
7.14.9 lvalue =& Ausdruck
7.14.10 lvalue =^ Ausdruck
7.14.11 LWert = | Ausdruck

Das Verhalten eines Ausdrucks der Form „E1 = op E2“ kann abgeleitet werden, indem man es als Äquivalent zu „E1 = E1 op E2“ nimmt; E1 wird jedoch nur einmal ausgewertet. Außerdem sind Ausdrücke wie „i =+ p“, bei denen ein Zeiger zu einer ganzen Zahl hinzugefügt wird, verboten.


Separat gibt es ein Papier ‘Entwicklung von C‘ von L. Rosler in ‘UNIX® SYSTEM: Readings and Applications, Volume II’, ursprünglich veröffentlicht von AT&T als deren Technical Journal für Oktober 1984, später veröffentlicht 1987 von Prentice-Hall (ISBN 0-13-939845-7). Ein Abschnitt davon ist:

III. Verwalten von inkompatiblen Änderungen

Einige der vorgenommenen Änderungen verändern zwangsläufig die Semantik vorhandener gültiger Programme. Diejenigen, die die verschiedenen intern verwendeten Compiler warten, versuchen sicherzustellen, dass Programmierer angemessen gewarnt werden, dass solche Änderungen wirksam werden, und dass die Einführung einer neuen Compiler-Version nicht dazu zwingt, alle Programme sofort neu zu kompilieren.

Beispielsweise in den frühesten Implementierungen der mehrdeutige Ausdruck x=-1 wurde als “dekrementiere x um 1” interpretiert. Es wird jetzt so interpretiert, dass es “x den Wert -1 zuordnen” bedeutet. Diese Änderung erfolgte im Laufe von drei jährlichen Hauptversionen. Zuerst der Compiler und die lint Die Programmüberprüfung wurde geändert, um eine Warnmeldung über das Vorhandensein einer “altmodischen” Zuweisungsoperation wie z =-. Als nächstes wurden die Parser auf die neue Semantik umgestellt, und die Compiler warnten vor einer mehrdeutigen Zuweisungsoperation. Schließlich wurden die Warnmeldungen beseitigt.

Unterstützung für die Verwendung einer “altmodischen Initialisierung”

int x 1;

(ohne Gleichheitszeichen) wurde durch eine ähnliche Strategie gelöscht. Dies hilft dem Parser, eine intelligentere Diagnose von Syntaxfehlern zu erstellen.

Wie vorauszusehen war, ignorierten einige C-Anwender die Warnungen, bis die Einführung der inkompatiblen Compiler sie dazu zwang, sich zu entscheiden, ob sie ihren veralteten Quellcode ändern oder die Wartung ihrer eigenen Versionen des Compilers übernehmen wollten. Aber insgesamt war die Strategie des schrittweisen Wandels erfolgreich.


Auch in Brian W. Kernighan und Dennis M. Ritchie
Die Programmiersprache C, 1. Aufl (1978), auf S. 212 in Anhang A, §17 Anachronismenes sagt:

Frühere Versionen von C verwendeten das Formular =op Anstatt von op= für Zuweisungsoperatoren. Dies führt zu Mehrdeutigkeiten, typisch für:

x=-1

was tatsächlich dekrementiert x seit der = und die - benachbart sind, die aber leicht zuzuordnen sind -1 zu x.

Es ist nur eine Zuweisung, gefolgt von einem unären Plus.

#include <stdio.h>
int main() {
    int a;
    a =+ 5;
    printf("%d\n",a);
    return 0;
}

Druckt “5”. Veränderung a =+ 5 zu a =- 5 und es druckt “-5”. Eine einfachere Art zu lesen a =+ 5 ist wahrscheinlich a = +5.

  • Dieser Test muss initialisiert werden a auf etwas anderes als Null. Wenn du benutzt int a = 3; kommst du auf das selbe ergebnis?

    – Hand-E-Food

    28. September 2011 um 0:38 Uhr

  • @Hand-E-Food: Sein Test wird nicht initialisiert a eigentlich auf Null oder einen anderen Wert.

    – Kipp

    29. September 2011 um 17:23 Uhr

  • Es war nicht als Test gedacht. Als Grund habe ich die Initialisierung von a Auf seiner eigenen Linie war es, es dem ähnlicher zu machen, von dem ich dachte, dass es im OP-Quellcode aussehen könnte – ich hätte es vielleicht sagen sollen /*other code*/ zwischen Erklärung und Abtretung.

    – Benutzer786653

    29. September 2011 um 18:36 Uhr

Benutzeravatar von onemasse
eine Masse

Es ist eine alte nicht mehr existierende Variante von +=. In modernen Compilern entspricht dies einem Zuweisungsoperator, gefolgt von einem unären +.

Ich finde

a =+ 5;

sollte gleichwertig sein

a = (+5);

und daher Code von sehr schlechtem Stil sein.

Ich habe den folgenden Code ausprobiert und es wurde “5” gedruckt:

#include <iostream>
using namespace std;

int main()
{
    int a=2;
    a =+ 5;
    cout << a;
}

  • Diese Frage bezieht sich auf C, und Sie sprechen von C++.

    Benutzer142019

    27. September 2011 um 18:47 Uhr

  • Ich bekomme das gleiche Verhalten mit einer .c-Datei in VS2010.

    – Steve Rowe

    27. September 2011 um 19:18 Uhr

Nikos Benutzeravatar
Niko

Nachdem ich Ihre Frage gelesen hatte, habe ich diese gerade untersucht. Lassen Sie mich Ihnen sagen, was ich gefunden habe. Habe es mit gcc und turboc probiert. Ich habe es in Visual Studio nicht sichergestellt, da ich es nicht auf meinem PC installiert habe

  int main()
  { 
   int a=6;
   a =+ 2;
   printf("%d",a);
  }  o/p , a value is 2

  int main()
  {
   int a=6;
   a =- 2;
   printf("%d",a);
  } o/p , a value is -2 

Ich weiß nichts über die anderen Antworten, da sie sagten, es sei eine alte Version von C. Aber die modernen Compiler behandeln sie als zuzuweisenden Wert (das ist positiv oder negativ, nichts weiter als das), und der folgende Code macht mich sicherer.

  int main()
  { 
   int a=6;
   a =* 2;  \\ Reporting an error inavlid type of argument of unary *
   printf("%d",a);
  } 
 if *= is equal to =* then it should not report error but its throwing an error

  • Diese Frage bezieht sich auf C, und Sie sprechen von C++.

    Benutzer142019

    27. September 2011 um 18:47 Uhr

  • Ich bekomme das gleiche Verhalten mit einer .c-Datei in VS2010.

    – Steve Rowe

    27. September 2011 um 19:18 Uhr

Benutzeravatar von Hassan Uddin
Hassan Udin

Mit “=+” weisen Sie nur dem Operanden einen positiven Wert zu, zum Beispiel int a = +10; wie für negative Zahl int a = -10;

1409180cookie-checkWas bedeutet =+ in C?

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

Privacy policy