2017-05-29 5 views
-7

Donc je crois que si jeEn utilisant ++ int et int + 1 et d'obtenir un résultat différent

int i = 0; 
i++; 

OU

++i; 

OU

i += 1; 

OU

i = i + 1; 

il est censé donner le même résultat. Sauf que quand je l'ai utilisé dans mon programme, il m'a donné un résultat différent.

Le contexte spécifique était dans l'appel à une fonction récursive. Essayer mon meilleur, bien que l'anglais ne soit pas ma langue principale, ni pour moi ni mon programme ...

Ma fonction, fondamentalement, calcule le "degré" de la différence entre deux mots. En guise d'optimisation, ma première vérification à chaque appel est de voir si mon nombre d'erreurs est supérieur à un nombre maximum donné ou à des erreurs. Alors, quand il appelle lui-même, il va comme:

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

Maintenant, dans certains cas, il se dit aussi avec une erreur comme si additionnelle:

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

Sauf, ces deux appels ne produiraient pas le même résultat, même si je n'ai changé que ++ et +1 dans mon appel récursif. Celui qui a fini par me donner de bons résultats était +1, et ma fonction fonctionne maintenant correctement, mais je ne comprends pas comment cela a fait une différence.

Quelqu'un peut-il m'expliquer cela? :) merci

EDIT


Merci pour toutes ces réponses. Je ne peux/ne peux pas montrer ma fonction, parce que:

1- tout est en français (projet d'école, doit être en français) donc tous mes commentaires, noms de variables et autres ne signifieraient rien pour la plupart des gens

2- Je crois que mes camarades de classe utilisent très probablement aussi ce site et je ne voudrais pas que mon code soit volé jusqu'à être accusé d'avoir copié le travail de quelqu'un d'autre.

l'enseignant nous a fourni un algorithme de base, ce qui conduit la fonction à appeler lui-même 3 fois de suite, en cas wordlength n'est pas 0. qui sont:

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]) 

et nous prenons le résultat le plus bas de ces trois appels. Donc, chaque fois que nous regardons 2 longs caractères, il passe quelques dizaines de fois à travers la fonction à travers les différents appels. Le +1 à la fin signifie que nous considérons qu'il y a une erreur ici. le dernier appel n'ajoute qu'une erreur si les deux lettres sont différentes.

Mon touche personnelle était d'avoir la place:

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 

et cela m'a donné des résultats erronés à la fin, je souvent, mais pas toujours, finissent avec une « erreur » supplémentaire. je l'ai changé à:

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 

et maintenant il fonctionne parfaitement. Aucune idée pourquoi il a fait une différence bien et qui est ce que je sens que je dois comprendre en quelque sorte ...

+0

Bienvenue dans Stack Overflow. Veuillez prendre le temps de lire [The Tour] (http://stackoverflow.com/tour) et de consulter le contenu du [Centre d'aide] (http://stackoverflow.com/help/asking) quoi et comment vous pouvez demandez ici. –

+3

Le contexte est insuffisant pour répondre à votre question. Veuillez fournir un [MCVE] (stackoverflow.com/help/mcve). –

+0

Les préfixes par rapport à l'incrément de postfix donnent des résultats différents dans différents contextes. Vous devez montrer le code * réel * pour que nous puissions répondre. –

Répondre

1
  • ++i signifie « incrément i, puis utilisez la nouvelle valeur »
  • i++ signifie « incrément i, puis utiliser la valeur de pré-incrémentée »
  • i+1 signifie "laisser i as = est, puis d'utiliser plus de 1 i"
  • i=i+1 ou i+=1 signifie "attribuer i à 1 de plus que le précédent i"

Le quatrième cas est un peu délicat à utiliser dans une instruction imbriquée, il est donc préférable de le conserver sur sa propre ligne (entouré par ;).

Une autre chose à considérer est que si vous essayez d'incrémenter i plus d'une fois dans une seule instruction, le résultat est indéfini. Quelque chose comme ++i + i++ est juste dehors.


Quand je regarde vos deux morceaux de code, je vois une différence dramatique.

Dans ce cas, vous incrémentez nbError deux (parfois trois) fois.

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 

Il est incrémenté une fois dans chacune des trois premières lignes. Dans le second cas, vous n'augmentez que nbError lorsque la condition if est satisfaite.

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) Vous devez utiliser des commentaires pour demander des éclaircissements sur la question. 2) Vous n'avez pas défini ce que vous entendez par "use the value". Le fait est que «je» aura la même valeur, à la fin de chaque déclaration, pour tous les cas énumérés. 3) _Le quatrième cas est un peu délicat à utiliser dans une déclaration imbriquée_ Comment est-ce difficile? Il renvoie la valeur de ce qui a été affecté. –

+0

2) Point pris, mais je ne vais pas dire "retourné de l'implémentation de l'opérateur" parce que c'est clairement pour un débutant. 3) Le quatrième cas est délicat si vous essayez d'intégrer cette ligne en tant qu'argument de fonction. foo (i = i + 1) se salit assez rapidement et cela devrait être évité. – Stewart

+0

Je, personnellement, ne vois pas, comment c'est difficile. Comme je l'ai déjà dit: il retourne ce qui a été assigné. Puisque dans votre exemple l'instruction 'i + 1' est assignée, la valeur de cela est retournée, donc' i = 'partie est une information superflue, et peut être ignorée, pendant la lecture. –