Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中的for循环条件中未声明变量仍然有效_C_Variables_For Loop_Initialization - Fatal编程技术网

C中的for循环条件中未声明变量仍然有效

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<

我编写了下面的代码来查找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);
}
#包括
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;
}