gpt4 book ai didi

c - 添加额外的 'int' 关键字时,while 循环不会中断?

转载 作者:太空宇宙 更新时间:2023-11-04 06:10:55 25 4
gpt4 key购买 nike

我在 codewars 上做了一些练习,不得不做一个 digital_root 函数(递归地将一个数字的所有数字加在一起,直到只剩下一个数字)。我相当自信我做对了,但出于某种原因,我的 while 循环从未中断,即使我的打印显示 len 为 1。

#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。

(Ps。当我在 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

[ Live demo ]

此程序输出x 的内存地址和值。 x 的大多数使用是指在 main 开头声明的外部变量。但是在内部 block 中,在 int x = 123; 之后,所有出现的 x 都指的是第二个单独的变量,该变量恰好也称为 x(但在其他方面是独立的)。

当执行离开内部 block 时,外部 x 变量再次可见。

这也称为 shadowing .

在您的代码中,外部 len 永远不会被修改,因此 while(len > 1) 始终为真。


顺便说一下,阴影在大多数支持 block 作用域的语言中是一个非常常见的概念:

关于c - 添加额外的 'int' 关键字时,while 循环不会中断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56927305/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com