Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.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
为什么默认情况下,varibale在c中声明为静态? #包括 void func(); void func() { int-y; y=y+2; printf(“%d”,y); } int main() { func(); func(); 返回0; }_C_Variables - Fatal编程技术网

为什么默认情况下,varibale在c中声明为静态? #包括 void func(); void func() { int-y; y=y+2; printf(“%d”,y); } int main() { func(); func(); 返回0; }

为什么默认情况下,varibale在c中声明为静态? #包括 void func(); void func() { int-y; y=y+2; printf(“%d”,y); } int main() { func(); func(); 返回0; },c,variables,C,Variables,为什么第二次调用func()时,变量y必须消失?为什么它的行为像静态变量一样,即使它没有被声明?它是未定义的行为,因为未初始化的局部变量 如果在为自动存储变量赋值之前使用了该变量,则该存储可能会保存以前保存的任何内容,因此该变量的内容将不可预测 C标准为6.3.2.1 p2: 如果左值指定自动存储持续时间的对象,则 可以用寄存器存储类声明(从未声明过 该对象未初始化(未声明) 使用初始值设定项,且之前未对其进行赋值 要使用),该行为未定义 因此,最好在创建变量后立即初始化变量,如: #i

为什么第二次调用func()时,变量y必须消失?为什么它的行为像静态变量一样,即使它没有被声明?

它是未定义的行为,因为未初始化的局部变量

如果在为自动存储变量赋值之前使用了该变量,则该存储可能会保存以前保存的任何内容,因此该变量的内容将不可预测

C标准为6.3.2.1 p2:

如果左值指定自动存储持续时间的对象,则 可以用寄存器存储类声明(从未声明过 该对象未初始化(未声明) 使用初始值设定项,且之前未对其进行赋值 要使用),该行为未定义

因此,最好在创建变量后立即初始化变量,如:

    #include<stdio.h>
void func();

void func()
{
int y;
y=y+2;
printf("%d",y);
}

int main()
{
func();
func();
return 0;
}

程序具有未定义的行为,因为函数
func
中使用了未初始化的变量
y

void func()
{
int y = 0;
       ^^^
y=y+2;
printf("%d",y);
}

对于这个问题,该函数可以使用未被其他函数覆盖的相同内存。因此,在函数调用之间,存储在内存中的值可以相同。

编译器应该警告您,您的代码正在生成未定义的行为。但默认情况下,它始终初始化为零
void func()
{
int y;
^^^^^^
y=y+2; // using an uninitialized variable
printf("%d",y);
}