簡體   English   中英

浮點方法的奇怪行為。 超載?

[英]Odd behavior of a float method. Overloading?

有誰看到一個為什么它只會不返回任何東西的原因?

public static float  sumDigits(int n) {
    float retVar = 0;
    while (n > 10) {
        float d;
        for (d = 0; d < n; d *= 10);
        d /= 10;
        retVar += n / d;
        n %= d;
    }
    n += n;
    return retVar;
}

我通過

System.out.println(sumDigits(123) + "");

分號放置錯誤:

for (d = 0; d < n; d *= 10); // that terminal semicolon will mess you up!

這等效於:

for (d = 0; d < n; d *= 10) {
  // do nothing
} 
  • 擺脫那個終端分號。
  • 使d變量位於for循環本地: for (int d = 0; d < n; d *= 10) {...}
  • 始終將所有循環塊括在花括號中
  • 好的代碼格式不只是為了使您的代碼循環漂亮-還可以幫助您調試。

正如已經指出的那樣,分號放置意味着您正在執行不執行任何操作的循環:

    for (d = 0; d < n; d *= 10);
    d /= 10;
    retVar += n / d;
    n %= d;

但是,僅修復循環結構並不能幫助您:

    for (d = 0; d < n; d *= 10) {
        d /= 10;
        retVar += n / d;
        n %= d;
    }

首先,如果您以d = 0開頭,則d /= 10d *= 10都將使d等於0。這不是您想要的。 這將導致無限循環。

其次,假設您從其他d開始:首先,在循環的第一條語句中將其除以10。 然后,當您返回以重復該循環時,請再次將其乘以10。 那只是帶您回到開始的地方。 這樣也會導致無限循環。

通常,當您在for循環中有一個要更改的變量時,在循環體中也修改相同的變量是錯誤的。 (在此示例中為d 。)通常這只是一個錯誤。 即使這不是一個錯誤,並且您知道自己在做什么,但我認為這仍然是一種不好的做法,因為它會使讀者感到困惑。 如果您確實想做類似的事情,請改用while循環。

我實際上認為我知道您的for循環應該做什么,這是一個小功能。 但是,正如其他人指出的那樣, d從0開始,所以它總是以0結尾。

只是將d更改為1將停止無限循環:

for (d = 1; d < n; d *= 10);

但是答案仍然是錯誤的,因為看起來您正在嘗試對數字求和。 (例如1 + 2 + 3 = 6 ,但是返回的答案是3.53

由於您要處理的是單個數字,因此在這里使用float是不好的,因為您不希望使用小數。 您希望數字四舍五入。 因此,您需要將您的臨時變量更改為int。

最后一件事是跳過最后一位數字。 此時,我得到3作為答案。 while(n > 10)更改為while(n > 0) ,將返回正確的答案。

所以代碼是這樣的:

public static int sumDigits(int n) {
    int retVar = 0;
    while (n > 0) {
        int d;
        for (d = 1; d < n; d *= 10);

        d /= 10;
        retVar += n / d;
        n %= d;
    }
    return retVar;
}

提示,有一個簡單的方法可以解決此問題,即從最小的數字開始而不是最大的數字開始:

while(n > 0) {
    retVar += n % 10;
    n /= 10;
}

最后說明

如果我對for循環是正確的,那么帶回家的重要一點是,如果您編寫這樣的內容,幾乎沒有人會認為這是故意的。 像這樣的語法實際上可能正常工作,但是它晦澀難懂,更像是一種新穎性。

循環可以像這樣替換,它更加清晰和緊湊:

int d = 0;
while(d < n) {
    d *= 10;
}

或者,如果您真的想要:

int d = 0;
while(d < n) d *= 10; // not recommended but clearly has a body

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM