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

时间:2017-03-06 14:55:45

标签: c variables for-loop initialization

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

#include<stdio.h>
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);
}

3 个答案:

答案 0 :(得分:3)

  

我对这个程序的运作方式感到困惑

嗯,“作品”在这里是一个非常糟糕的观察/决定。这是undefined behavior

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

引用C11标准,章节§6.7.9

  

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

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

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

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

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

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

答案 1 :(得分:2)

未初始化的变量必须包含一些值 - 即使这些值无用,计算机中的每个地址都必须包含1和0的组合。因此,如果您没有自己初始化它,则在首次创建时会给它一个随机的。通常它甚至不会被给予&#34;数据非常重要&#34;无论在创建时给予生存的地址的价值如何,但不同的环境将处理这个&#34;非初始化&#34;不同。在你目前的条件下,你现在基本上是幸运的。

出于这个原因,这种代码被认为具有undefined behavior,因为在任何情况下都不能保证这样的幸运。安全并始终初始化变量的值,因为当以后工作的代码突然不起作用时,这很难被捕获。

答案 2 :(得分:1)

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

在您的情况下,您不需要0,只需在分组产生0时停止(这可能是您忘记初始化n的原因)

n