在C-still工作中未在for循环条件中声明的变量

我编写了下面的代码来查找C中所有数字的总和,当我编译并运行它时,它成功了。 但是,后来才意识到我没有在for循环的条件中为变量’ n输入任何值 。 即使没有为条件变量赋值,我也很困惑这个程序是如何工作的。 我想澄清一下。

#include void main() { int no,a,b,n,sum=0; printf("Enter the number to be added"); scanf("%d",&no); for(int i=0;i<n;i++) { a=no%10; b=no/10; sum=a+sum; no=b; } printf("The sum is %d",sum); } 

我对这个程序是如何工作感到困惑

那么, “作品”在这里是一个非常糟糕的观察/决定。 这是未定义的行为 。

您尝试使用自动局部变量n的值,而它是不确定的 。 这会调用UB。

引用C11标准,第6.7.9章

如果未显式初始化具有自动存储持续时间的对象,则其值不确定。 […]

因此,在您的情况下, n符合上述标准,因此内容是不确定的。

现在,在此之后,如果您尝试使用变量,同时它保持不确定的值

  • 没有地址
  • 可以有陷阱表示

用法将导致未定义的行为。 这就是这种情况。

也就是说,对于托管环境, main()的符合签名至少是int main(void)

未初始化的变量必须包含一些值 – 即使这些值无用,计算机中的每个地址都必须具有1和0的某种组合。 因此,如果您没有自己初始化它,则在首次创建时会给它一个随机的。 通常它甚至不是“给定”数据,因为它“承担”在创建时给予它的地址的任何值,但是不同的环境将以不同的方式处理这种“非初始化”。 在你目前的条件下,你现在基本上是幸运的。

出于这个原因,这种代码被认为具有未定义的行为,因为在任何情况下都不能保证这样的幸运。 保持安全并始终初始化变量的值,因为当以后突然工作的代码没有时,这可能是一件很难的事情。

n未初始化,因此运行时在分配的内存位置存在任何值。 所以,如果你很幸运,经过几次迭代后, no 0 ,结果是正确的,但这只是运气。

在你的情况下,你不需要n ,只需在除法产生0时停止(这可能是你忘记初始化n

 while(no!=0) { a=no%10; b=no/10; sum+=a; no=b; }