2017-01-20 148 views
-2

當我聲明while循環之外的移位時,我得到的結果等於16這是一個錯誤的答案。但是當我在while循環中聲明它時,我得到了正確的答案結果== 11.差異如何改變答案?在while循環之外初始化變量是什麼原因?

long a = Math.abs((long)100); 
long b = Math.abs((long)9); 
int result = 0; 

while (a >= b){ 
    int shift = 0; 
    while(a >= (b<<shift)){ 
     shift ++; 
    } 

    a -= b << (shift - 1); 
    result += 1 << (shift - 1); 
} 
+0

很明顯,循環外部的'shift'會保持它之前迭代的值,而over版本則不會。 – Tom

+1

這不是你聲明的地方,它是你設置爲0的地方。 – Arkadiy

回答

2

如果你聲明沒關係,其實 - 重要的是何時以及是否您將該值重置爲零。例如:

while (a >= b){ 
    int shift = 0; 

int shift; 
while (a >= b){ 
    shift = 0; 

將是你的目的是相同的。但是,如果你不是這樣做:

int shift = 0; 
while (a >= b){ 

那麼你就不會重置移位到0在每個循環的開始,將導致不同的答案比第2位。

0

如果您在outer while循環外定義該轉換,它只會被初始化一次。因此,每個外部while循環的新迭代將使用上次迭代的移位值(您執行shift ++更改該值),即0, 1, 2,...

如果您聲明outer while while循環內的移位,在每次迭代時設置爲0。因爲結果取決於班次的價值,所以聲明的位置很重要。

0

當你在循環中聲明你的移位變量。每次迭代時不會重置爲0。

但是,如果每當遍歷循環時將其放入循環中,則其值將設置爲零(更具體地說是再次聲明變量),從而使輸出按預期方式運行。

這不是一件有效的事情。我會建議你做的就是聲明你的變量外循環,並在循環重置其值在下面的代碼

long a = Math.abs((long)100); 
long b = Math.abs((long)9); 
int result = 0; 
int shift = 0; 

while (a >= b){ 
    shift = 0; 
    while(a >= (b<<shift)){ 
    shift ++; 
    } 

    a -= b << (shift - 1); 
result += 1 << (shift - 1); 
} 
0

這不是變量的聲明改變你的答案,這是事實上,你把它設置爲0每次迭代的外層循環。這是你想要寫的代碼:

long a = Math.abs((long)100); 
long b = Math.abs((long)9); 
int result = 0; 
int shift = 0; 
while (a >= b){ 
    shift = 0; 
    while(a >= (b<<shift)){ 
     shift ++; 
    } 

a -= b << (shift - 1); 
result += 1 << (shift - 1); 
} 
相關問題