Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.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 局部变量的自动初始化_C_Variables_Scope_Initialization - Fatal编程技术网

C 局部变量的自动初始化

C 局部变量的自动初始化,c,variables,scope,initialization,C,Variables,Scope,Initialization,我有以下代码片段 int j; printf("%d",j); 正如所料,我得到了一个垃圾值 32039491 但是当我在上面的代码片段中包含一个循环时,比如 int j; print("%d",j); while(j); 我在程序的多次试验中得到以下输出 0 我一直认为局部变量在默认情况下被初始化为垃圾值,但在使用循环时,变量看起来会自动初始化。它具有不确定值。它可以是任何东西 引用C11§6.7.9 如果没有显式初始化具有自动存储持续时间的对象,则其值为 不确定的[……] 除非显式初始化

我有以下代码片段

int j;
printf("%d",j);
正如所料,我得到了一个垃圾值

32039491

但是当我在上面的代码片段中包含一个循环时,比如

int j;
print("%d",j);
while(j);
我在程序的多次试验中得到以下输出

0


我一直认为局部变量在默认情况下被初始化为垃圾值,但在使用循环时,变量看起来会自动初始化。

它具有不确定值。它可以是任何东西

引用
C11
§6.7.9

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

除非显式初始化,否则自动局部变量将包含不确定值。如果您试图在变量保持不确定值时使用该变量

  • 没有地址
  • 可以有陷阱表示
这种用法会导致错误

正如所料,我得到了一个垃圾值

那么你的期望是毫无道理的希望。当您使用未初始化对象的不确定值时,通常会得到(仅对于代码片段就可以得到)未定义的行为。打印垃圾值只是无数可能的表现形式之一

我一直认为局部变量在默认情况下被初始化为垃圾值,但在使用循环时,变量看起来会自动初始化


你想错了,你也得出了错误的结论。这两个代码片段在单独运行时都会显示未定义的行为。您不能安全地依赖任何特定的结果。

我使用的是VC++6.0 IDE和编译器,不会得到不同的结果。垃圾值根据其定义是垃圾。您不能依赖它们具有特定的值。gargabe值可以是包含0的任何内容。您无法知道这是未定义的行为,因为我们无法根据OPs代码确定范围。类似地,您不能假设OP使用的是具有陷阱表示的系统。因此,这可能是错误的:“当您使用未初始化对象的不确定值时,您会得到未定义的行为”@伦丁,谢谢你指出这一点。我对答案稍加限定,以允许自己拥有我认为足够的黄鼠狼空间。任何对我为什么这样做感兴趣的人(即行为未定义的细节)都可以按照您提供的链接进行操作。如果OPs代码中的变量具有自动存储持续时间(我们无法确定),则访问它们是未定义的行为,但不是因为陷阱表示@谢谢你的指点,先生,更新了我的答案,现在好点了吗?