2017-05-29 92 views
-7

因此,我相信,如果我做使用++ int和INT + 1,並獲得不同的結果

int i = 0; 
i++; 

OR

++i; 

OR

i += 1; 

OR

i = i + 1; 

它應該給出相同的結果。

除了在我的程序中使用它時,它給了我不同的結果。

具體的上下文是在對遞歸函數的調用中。盡我所能,雖然英語不是我的主要語言,但對我或我的程序都沒有...

我的功能基本上是計算兩個單詞之間差異的「程度」。作爲優化,我對每次電話的第一次驗證是查看我的「錯誤」數量是否高於給定的最大數量或錯誤。所以,當它調用本身,它是這樣:

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

現在,在某些情況下,還與其它附加的錯誤,像這樣自稱:

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

除此之外,這兩個調用不會產生即使我在遞歸調用中只更改了+++1。最終給我帶來好成績的是+1,我的功能現在可以正常工作,但我不明白它是如何產生影響的。

有人可以向我解釋這個嗎? :)謝謝

編輯


感謝所有這些問題的答案。我沒有/不能顯示我的功能,因爲:

1-全部用法語(學校項目,必須用法語)所以我所有的評論,變量名稱等對大多數人都沒有任何意義

2-我相信我的同學很可能也會使用這個網站,我不希望我的代碼被盜,以至於被指責抄襲別人的作品。

老師與基礎算法,從而導致該函數調用自身3倍成一排,以防字長爲我們提供了不爲0,它們分別是:

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

,我們採取的最低水平。這三個電話。所以每當我們看到兩個字符長的單詞時,它通過不同的調用通過函數進行了幾十次。最後的+1意味着我們認爲這裏有一個錯誤。如果兩個字母不同,最後的呼叫只會添加一個錯誤。

我個人接觸是有代替:

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 

,這給了我錯誤的結果到了最後,我會經常,但並非總是如此,結束了一個額外的「錯誤」。 我改成:

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 

現在它完美的工作。不知道爲什麼,這就不一樣了,雖然,這就是我覺得我需要以某種方式瞭解...

+0

歡迎來到Stack Overflow。請花些時間閱讀[The Tour](http://stackoverflow.com/tour),並參閱[幫助中心](http://stackoverflow.com/help/asking)中的資料,瞭解您可以在這裏問。 –

+3

沒有足夠的上下文來回答你的問題。請提供[MCVE](stackoverflow.com/help/mcve)。 –

+0

前綴vs後綴增量在不同的上下文中給出不同的結果。您需要顯示*實際*代碼以便我們能夠回答。 –

回答

1
  • ++i手段「增量我,然後使用新的價值」
  • i++手段「增量我,然後使用預遞增值」
  • i+1指‘離開i設定爲=是,則用1以上I’
  • i=i+1i+=1意味着‘分配比以前的i設爲1更我’

第四種情況在嵌套語句中使用有點棘手,所以最好將它保留在自己的行上(由;包圍)。

要考慮的另一件事是,如果您嘗試在單個語句中多次增加i,結果是未定義的。像++i + i++就是這樣的。


當我看着你的兩段代碼時,我看到了巨大的差異。

在這種情況下,您將增加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 

它在前三行的每一行中遞增一次。在第二種情況下,只有當滿足if條件時,纔會增加nbError

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)您應該使用意見來要求澄清問題。 2)你沒有通過_使用value_來定義你的意思。事實是 - 在每個聲明結束時,''i'對於所有列出的案例都具有相同的價值。 3)_第四種情況在嵌套語句中使用有點棘手_它有多棘手?它返回分配的值。 –

+0

2)採取了一點,但我不打算說「從操作員實施返回」,因爲這顯然是一個初學者。 3)如果試圖嵌入作爲函數參數的內聯函數,則第四種情況非常棘手。 foo(i = i + 1)很快就會變得混亂,應該避免。 – Stewart

+0

我個人看不到,它是如何棘手的。正如我已經說過的那樣:它會返回分配的內容。因爲在你的例子語句中賦值了'i + 1',所以返回值就是'i ='部分是多餘的信息,在讀取時可以忽略。 –

相關問題