C中的for循环条件中未声明变量仍然有效
我编写了下面的代码来查找C中所有数字的总和,当我编译并运行它时,它成功了。 但是,直到后来我才意识到,在for循环的条件下,我没有为变量“n”输入任何值。 我对这个程序的工作原理感到困惑,即使没有为条件变量赋值。 我想澄清这一点C中的for循环条件中未声明变量仍然有效,c,variables,for-loop,initialization,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<
#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);
}
#包括
void main()
{
整数,a,b,n,和=0;
printf(“输入要添加的编号”);
scanf(“%d”和“否”);
对于(int i=0;i
我对这个程序的工作原理感到困惑
“有效”在这里是一个很糟糕的观察/决定
您试图在不确定的情况下使用自动局部变量n
的值。这将调用UB
引用C11
标准第§6.7.9章
如果没有显式初始化具有自动存储持续时间的对象,则其值为
不确定。[…]
因此,在您的情况下,n
符合上述标准,因此内容是不确定的
现在,在这之后,如果您试图使用一个变量,而它持有不确定的值,并且
- 没有地址
- 可以有陷阱表示
这种用法会导致未定义的行为。这里就是这种情况
也就是说,对于托管环境,main()
的一致性签名至少是intmain(void)
我对这个程序的工作原理感到困惑
“有效”在这里是一个很糟糕的观察/决定
您试图在不确定的情况下使用自动局部变量n
的值。这将调用UB
引用C11
标准第§6.7.9章
如果没有显式初始化具有自动存储持续时间的对象,则其值为
不确定。[…]
因此,在您的情况下,n
符合上述标准,因此内容是不确定的
现在,在这之后,如果您试图使用一个变量,而它持有不确定的值,并且
- 没有地址
- 可以有陷阱表示
这种用法会导致未定义的行为。这里就是这种情况
也就是说,对于托管环境,main()
的一致性签名是intmain(void)
,至少。n
没有初始化,因此在运行时分配的内存位置上存在的任何东西都是值得的。因此,如果幸运的话,经过几次迭代后,no
是0
,结果是正确的,但这只是运气
在您的情况下,您不需要n
,只要在除法得到0时停止即可(这可能就是您忘记初始化n
)
n
未初始化,因此运行时分配的内存位置上的任何内容都是值得的。因此,如果幸运的话,经过几次迭代后no
为0
,结果是正确的,但这只是运气
在您的情况下,您不需要n
,只要在除法得到0时停止即可(这可能就是您忘记初始化n
)
未初始化的变量必须包含一些值-计算机中的每个地址都必须有1和0的某些组合,即使这些值是无用的。因此,如果您自己没有将其初始化为某个值,则在首次创建时会给它一个随机值。通常,它甚至不是“给定”数据,而是“承担”数据无论在创建时,地址上的值是什么,但不同的环境将以不同的方式处理此“非初始化”。在当前条件下,您现在基本上是幸运的
由于这个原因,这种代码被认为是有缺陷的,因为你不能保证在任何情况下都能得到这样的幸运。请注意安全,并始终为变量初始化值,因为当以前工作的代码突然不工作时,这可能是一件很难捕捉到的事情。未初始化的变量必须包含一些值-每个地址计算机中的必须有一些1和0的组合,即使这些值是无用的。因此,如果您自己没有将其初始化为某个值,则在第一次创建时会给它一个随机值。通常,它甚至不是“给定”数据,而是“承担”数据无论在创建时,地址上的值是什么,但不同的环境将以不同的方式处理此“非初始化”。在当前条件下,您现在基本上是幸运的
由于这个原因,这种代码被认为是有风险的,因为你不能保证在任何情况下都能得到这样的运气。请注意安全,并始终初始化变量的值,因为这可能是一件很难在以后的代码突然不工作时捕捉到的事情。它有随机值、未初始化、未定义的行为。你能理解吗ase详细说明?增加编译的警告级别。任何像样的编译器都应该警告您n
未初始化。它具有随机值、未初始化、未定义的行为。您可以详细说明吗?增加编译的警告级别。任何像样的编译器都应该警告您n
未初始化t初始化。你能详细说明吗?@ArunRajasekar更新,希望有帮助。你能详细说明吗?@ArunRajasekar更新,希望有帮助。“注意安全,始终初始化变量的值,因为…”不会有太大帮助,因为代码没有检查scanf()
的返回值,这对于好的代码是必不可少的。scanf(“%d”,&no)如果发生罕见的输入错误,
可能会使no
处于未指定状态-在这种情况下,事先初始化没有帮助。“注意安全,始终初始化变量的值,因为…”不会像代码没有c一样有帮助
while(no!=0)
{
a=no%10;
b=no/10;
sum+=a;
no=b;
}