簡體   English   中英

添加額外的“ int”關鍵字時,while循環不會中斷嗎?

[英]While-loop not breaking when extra 'int' keyword added?

我在代碼戰中做了一些練習,不得不做一個digital_root函數(將數字的所有數字遞歸加在一起,直到只剩下一位數字為止)。 我相當有信心自己做對了,但是由於某種原因,即使打印顯示len為1,我的while循環也不會中斷。

#include <stdio.h>
#include <string.h>

int digital_root(int n) {
  char number[10];
  sprintf(number, "%d", n);

  int len = strlen(number);
  printf("Outer print: %s %d %d\n", number, n, len);
  int sum = 0;
  while(len > 1)
  {
    sum = 0;
    for(int i = 0; i<len; i++)
    {
      sum += number[i] - '0';
    }
    sprintf(number, "%d", sum);
    int len = strlen(getal);       //!!!
    printf("Inner print: %s %d %d\n", number, sum, len);


  }

  return sum;

}

我花了很長時間才弄清楚出了什么問題。 我注意到在重新計算while循環中的len(標有!!!的行)時,我復制粘貼了'int'關鍵字。 當我刪除它時(因為不需要將它重新定義為int,它已經是),所有事情突然都按預期的方式工作。

這有點使我困惑。 為什么會這樣呢? 我知道重新定義它是不好的做法,但是我不知道如何導致while循環不中斷?

使用的編譯器是Clan3.6 / C11。

(對。當我在TIO中嘗試相同的代碼時,在兩種情況下都有效...)

您不是在重新定義現有變量,而是在定義新變量。

考慮以下示例:

#include <stdio.h>

int main(void) {
    int x = 42;
    printf("Outside, start.     x (%p) = %d\n", (void *)&x, x);
    {
        printf("Inner block, start. x (%p) = %d\n", (void *)&x, x);
        int x = 123;
        printf("Inner block, end.   x (%p) = %d\n", (void *)&x, x);
    }
    printf("Outside, end.       x (%p) = %d\n", (void *)&x, x);
    return 0;
}

樣本輸出:

Outside, start.     x (0x7ffd6e6b8abc) = 42
Inner block, start. x (0x7ffd6e6b8abc) = 42
Inner block, end.   x (0x7ffd6e6b8ab8) = 123
Outside, end.       x (0x7ffd6e6b8abc) = 42

[ 現場演示 ]

該程序輸出內存地址和x值。 x大多數用法是指在main開頭聲明的外部變量。 但是在內部塊中,在int x = 123; ,則x所有出現均指代第二個單獨的變量,該變量也被稱為x (但在其他方面是獨立的)。

當執行離開內部塊時,外部x變量再次變為可見。

這也稱為陰影

在您的代碼中,永遠不會修改外部len ,因此while(len > 1)始終為true。


順便說一句,在大多數支持塊作用域的語言中,陰影是一個非常普遍的概念:

您的第二個int len創建一個第二個並行變量,該變量在{}塊的末尾消失。 原始的len然后恢復原樣,完全沒有變化。 如果沒有第二個int則原始變量將被更改。 使用它,原始len實際上是一個不變的常數和無限循環。

暫無
暫無

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

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