Frage

Ich habe nie die usecase für Prä-Inkrement und Nachinkrement in eigentlichen Code zu sehen. Der einzige Ort, den ich sehen, wie sie am häufigsten Rätsel sind.
Meine Meinung nach ist es mehr Verwirrung führt eher als nützlich zu sein.

  • Gibt es einen wirklichen Nutzen-Case-Szenario für diese
  • kann nicht dies kann mit + =

    erfolgen

    y = x++

    y = x
    x += 1

War es hilfreich?

Lösung

Es ist nur ein kleiner Weg, um die gleiche Sache zu schreiben, und es ist verwirrend nur für diejenigen, die tief verstehen nicht, C (a) . Das gleiche Argument für den Ersatz gemacht werden könnte:

for (i = 0; i < 10; i++)
    printf ("%d\n", i);

mit:

i = 0;
while (i < 10) {
    printf ("%d\n", i);
    i = i + 1;
}

da jeder for kann auch mit while erfolgen, oder:

i = 0;
loop: if (i < 10) {
    printf ("%d\n", i);
    i = i + 1;
    goto loop;
}

da jeder Schleifenkonstrukt von Bedingungen und goto gebaut werden kann. Aber (ich hoffe) Sie würde das nicht tun, würden Sie?


(a) ich manchmal wie diese als einfache Aussagen und Nebenwirkungen, meinen Schüler etwas zu erklären, die C-Code mit in der Regel keine oder nur minimalen Verlust in der Lesbarkeit sein prägnanten ermöglicht.

Für die Anweisung:

y = x++;

die Anweisung x zu y mit dem Nebeneffekt wird die Zuweisung dass x danach erhöht wird. ++x ist das gleiche, es ist nur, dass die Nebenwirkung geschieht vorher.

In ähnlicher Weise ist die Nebenwirkung einer Zuweisung, dass es wertet als der Wert zugewiesen, so dass Sie Dinge tun können wie:

while ((c = getchar()) != -1) count++;

und das macht Dinge wie:

42;

perfekt gültig, aber nutzlos, C-Anweisungen.

Andere Tipps

Die Pre- und Post-Inkrement-Betreiber machen viel mehr Sinn, wenn man sie im Lichte der Geschichte betrachten, und wenn sie entworfen wurden.

Zurück in den Tagen, als C war im Grunde ein High-Level-Assembler für PDP-11 machines</flamebait>, und lange vor hatten wir die schöne Compiler optimieren wir jetzt haben, gibt gemeinsame Idiome waren verwendet, dass die Post-Inkrement-Operatoren für perfekt waren. Dinge wie diese:

char* strcpy(char* src, char* dest)
{
  /* highly simplified version and likely not compileable as-is */
  while (*dest++ = *src++);
  return dest;
}

Der Code in Frage erzeugten PDP-11 (oder andere) Maschinensprachcode, der die starke Nutzung der zugrundeliegenden Adressierungsart hergestellt (wie in Bezug direkte und relativ indirekt), dass genau eingearbeitet, diese Art von Prä- und Post-Inkrement und Dekrement-Operationen .

So Ihre Frage zu beantworten: do Sprachen "need" diese heutzutage? Nein natürlich nicht. Es ist beweisbar, dass Sie Notwendigkeit sehr wenig in Bezug auf Anweisungen zu berechnen Dinge. Die Frage ist interessanter, wenn Sie fragen: „Diese Funktionen sind wünschenswert?“ Um das würde ich ein qualifizierten „Ja“ beantworten.

Mit Ihrem Beispiel:

y = x;
x += 1;

vs.

y = x++;

Ich kann zwei Vorteile sehe direkt an der Spitze von meinem Kopf.

  1. Der Code ist prägnanter. Alles, was ich wissen muss, verstehen, was Sie an einem Ort zu tun (so lange, wie ich die Sprache kennen, natürlich!) Statt verteilt. „Verbreitung out“ über zwei Zeilen scheint wie ein wählerisch, was aber wenn man Tausende von ihnen tun kann es einen großen Unterschied in dem Ende machen.
  2. Es ist viel wahrscheinlicher, dass der Code generiert sogar von einem crappy Compiler im zweiten Fall atomar sein wird. Im ersten Fall wird es sehr wahrscheinlich nicht sein, wenn Sie einen schönen Compiler haben. (Nicht alle Plattformen haben eine gute, starke optimierende Compiler).

Auch finde ich es sehr zu sagen, dass Sie += reden, wenn diese selbst eine „unnötige“ Art und Weise ist x = x + 1; zu sagen .... Schließlich gibt kein Szenario Anwendungsfall bin ich für += dass couldn denken kann‘ t gut von _ = _ + _ statt serviert werden.

Sie versehentlich ein viel größeres Problem hier erhöhen, und es ist eine, die sich mehr machen und mehr bekannt, Sie als die Jahre (Jahrzehnte) vorbeigehen.

Sprachen machen oft den Fehler zu versorgen „Fähigkeiten“, wenn sie nicht sollten. IMO, ++ sollte eine eigenständige Aussage sein nur , und absolut nicht ein Ausdruck Operator.

Versuchen Sie, die folgende Nähe von Herzen zu halten: Das Ziel ist nicht Code für den zuständigen Ingenieur zu schaffen zu lesen. Das Ziel ist, Code für den zuständigen Ingenieur zu schaffen zu lesen, wenn er um 3 Uhr morgens erschöpft ist und hüpfte auf Koffein.

Wenn ein Ingenieur sagt Ihnen „Alle Code-Konstrukte können Sie in Schwierigkeiten geraten. Sie müssen nur wissen, was du tust.“, Dann zu Fuß weg zu lachen, weil er nur sich selbst als Teil des Problems ausgesetzt ist.

Mit anderen Worten, bitte nicht immer Code etwas wie folgt aus:

a[aIndex++] = b[++bIndex];

Sie können ein interessantes Gespräch über diese Art der Sache, finden Sie hier: Warum vermeiden Schritt ( "++") und Abnahme ( "-" ) Operatoren in JavaScript?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top