我编写了以下代码来查找 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);
}
答案 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
未初始化,因此在运行时分配的内存位置存在任何值。所以,如果你很幸运,经过几次迭代n
为no
,结果是正确的,但这只是运气。
在您的情况下,您不需要0
,只需在分组产生0时停止(这可能是您忘记初始化n
的原因)
n