自动初始化局部变量

我有以下代码片段。

int j; printf("%d",j); 

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

32039491

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

 int j; print("%d",j); while(j); 

我在该程序的多次试验中得到以下输出。

0

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

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

引用C11§6.7.9

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

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

  • 没有地址
  • 可以有陷阱表示

用法将导致未定义的行为 。

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

那么你的期望是不合理的希望。 当您使用未初始化对象的不确定值时,通常会得到(并且仅针对您的代码片段) 未定义的行为 。 打印垃圾值只是无限多种可能的表现forms之一。

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

你错了,你也得出了错误的结论。 当您单独站立时,两个代码段都表现出未定义的行为。 您无法安全地依赖任何特定结果。