2017-05-29 4 views
-7

So bekomme ich glaube, wenn ich++ int und int + 1 Verwendung und anderen Ergebnis

int i = 0; 
i++; 

ODER

++i; 

ODER

i += 1; 

ODER

i = i + 1; 
tun

soll es das gleiche Ergebnis geben.

Außer, wenn ich es in meinem Programm verwendete, gab es mir ein anderes Ergebnis.

Der spezifische Kontext befand sich innerhalb des Aufrufs einer rekursiven Funktion. mein Bestes Probieren, obwohl Englisch nicht meine Hauptsprache ist, weder mir oder mein Programm ...

Meine Funktion berechnet im Grunde das „Grad“ des Unterschiedes zwischen zwei Worten. Als eine Optimierung, ist meine erste Überprüfung bei jedem Anruf, um zu sehen, ob meine Anzahl von "Fehlern" höher ist als eine gegebene maximale Anzahl oder Fehler. Also, wenn es selbst nennt, es geht so:

errors = function(wordA,wordB, numberErrorMax, actualNumberOfErrors); 

nun in einigen Fällen, es nennt sich auch mit einem zusaetzliche Fehler wie so:

errors = function(wordA, wordB, numberErrorMax, actualNumberOfErrors+1) +1; 
errors = function(wordA, wordB, numberErrorMax, ++actualNumberOfErrors) +1; 

Außer, diese beiden Anrufe würden nicht produzieren das gleiche Ergebnis, obwohl ich nur die ++ und +1 in meinem rekursiven Aufruf geändert habe. Der eine, der mir gute Ergebnisse bescherte, war +1, und meine Funktion funktioniert jetzt richtig, aber ich verstehe nicht, wie es einen Unterschied machte.

Kann mir jemand das erklären? :) Dank

EDIT


Danke für all diese Antworten. Ich kann/kann meine Funktion nicht zeigen, weil:

1- es ist alles in Französisch (Schulprojekt, muss in Französisch sein), also alle meine Kommentare, Variablennamen und so würde den meisten Menschen nichts bedeuten

2- ich glaube meine Mitschüler höchstwahrscheinlich die Nutzung diese Website, wie gut und ich würde mein Code spät kopiert jemand andere Arbeit nicht will gestohlen werden beschuldigt.

der Lehrer hat uns mit einer Basis-Algorithmus, der die Funktion leitet sich 3-mal in Folge zu rufen, falls Wortlänge nicht 0 ist, die sind:

func(wA,wB, lengthA - 1, lengthB) + 1 
func(wA,wB, lengthA, lengthB - 1) + 1 
func(wA,wB, lengthA - 1, lengthB - 1) + (wA[i] != wB[i]) 

und wir nehmen mit dem niedrigsten Ergebnis von diese drei Anrufe. Wann immer wir 2 Zeichen lange Wörter betrachten, geht es ein paar Dutzend Mal durch die Funktion durch die verschiedenen Aufrufe. Das +1 am Ende bedeutet, dass wir hier einen Fehler sehen. Der letzte Anruf fügt nur einen Fehler hinzu, wenn die beiden Buchstaben unterschiedlich sind.

Meine persönliche Note war stattdessen haben:

func(wA,wB, lengthA - 1, lengthB, maxError, **++nbError**) + 1 
func(wA,wB, lengthA, lengthB - 1, maxError, **++nbError**) + 1 
if (wA[i] != wB[i]) { int err = 1; nbError++;} 

func(wA,wB, lengthA - 1, lengthB - 1, maxError, nbError) + err 

und das gab mir falsche Ergebnisse am Ende, würde ich oft, aber nicht immer, mit einem zusätzlichen „Fehlern“ enden. Habe ich es zu:

func(wA,wB, lengthA - 1, lengthB, maxError, **nbError+1**) + 1 
func(wA,wB, lengthA, lengthB - 1, maxError, **nbError+1**) + 1 
if (wA[i] != wB[i]) { int err = 1; nbError++;} 

func(wA,wB, lengthA - 1, lengthB - 1, maxError, nbError) + err 

und jetzt funktioniert es perfekt. Keine Ahnung, warum es einen Unterschied obwohl gemacht und das ist, was ich glaube, ich irgendwie verstehen müssen ...

+0

Willkommen bei Stack Overflow. Bitte nehmen Sie sich die Zeit, [The Tour] (http://stackoverflow.com/tour) zu lesen und beziehen Sie sich auf das Material aus der [Hilfe] (http://stackoverflow.com/help/asking), was und wie Sie können fragen Sie hier. –

+3

Es gibt nicht genügend Kontext, um Ihre Frage zu beantworten. Bitte geben Sie [MCVE] (stackoverflow.com/help/mcve) an. –

+0

Präfix vs Postfix Inkrement geben unterschiedliche Ergebnisse in verschiedenen Kontexten. Sie müssen den * tatsächlichen * Code anzeigen, damit wir antworten können. –

Antwort

1
  • ++i bedeutet „Schritt i, verwenden Sie dann den neuen Wert“
  • i++ bedeutet „Schritt i, dann verwenden, um den pre-inkrementierten Wert“
  • i+1 bedeutet "verlassen i as = ist, dann 1 mehr verwenden, als i"
  • i=i+1 oder i+=1 bedeuten "assign i auf 1 mehr als die vorherigen i"

Der vierte Fall ist in einer verschachtelten Anweisung ein wenig schwierig zu handhaben, daher ist es am besten, ihn in einer eigenen Zeile zu belassen (umgeben von ;).

Eine andere Sache zu beachten ist, dass wenn Sie versuchen, i mehr als einmal in einer einzigen Anweisung zu erhöhen, das Ergebnis nicht definiert ist. Etwas wie ++i + i++ ist direkt out.


Wenn ich Ihre zwei Codeabschnitte betrachte, sehe ich einen dramatischen Unterschied.

In diesem Fall erhöhen Sie zwei (manchmal drei) Male nbError.

func(wA,wB, lengthA - 1, lengthB, maxError, ++nbError) + 1 
func(wA,wB, lengthA, lengthB - 1, maxError, ++nbError) + 1 
if (wA[i] != wB[i]) { int err = 1; nbError++;} 
func(wA,wB, lengthA - 1, lengthB - 1, maxError, nbError) + err 

Es ist in jeder der ersten drei Zeilen inkrementiert. Im zweiten Fall erhöhen Sie nur nbError, wenn die Bedingung if erfüllt ist.

func(wA,wB, lengthA - 1, lengthB, maxError, nbError+1) + 1 
func(wA,wB, lengthA, lengthB - 1, maxError, nbError+1) + 1 
if (wA[i] != wB[i]) { int err = 1; nbError++;} 
func(wA,wB, lengthA - 1, lengthB - 1, maxError, nbError) + err 
+1

1) Sie sollten Kommentare verwenden, um nach der Klärung der Frage zu fragen. 2) Sie haben nicht definiert, was Sie meinen, indem Sie den Wert verwenden. Tatsache ist, dass "i" am Ende jeder Aussage den gleichen Wert für alle aufgelisteten Fälle hat. 3) _Der vierte Fall ist ein bisschen schwierig zu verwenden in einer verschachtelten Anweisung_ Wie ist es schwierig? Es gibt den Wert von was zugewiesen wurde zurück. –

+0

2) Punkt genommen, aber ich werde nicht sagen, "von der Betreiberimplementierung zurückgekehrt", weil dies eindeutig für einen Anfänger ist. 3) Der vierte Fall ist schwierig, wenn Sie versuchen, das in-line als Funktionsargument einzubetten. foo (i = i + 1) wird schnell unordentlich und das sollte vermieden werden. – Stewart

+0

Ich persönlich, sehe nicht, wie es schwierig ist. Wie ich schon sagte: Es gibt zurück, was zugewiesen wurde. Da in Ihrem Beispiel die Anweisung 'i + 1' zugewiesen ist, wird der Wert dieser zurückgegeben, daher ist 'i =' part eine überflüssige Information und kann ignoriert werden, während sie gelesen wird. –

Verwandte Themen