[英]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.