【问题标题】:What happens in C when you print a declared, but unassigned variable?当您打印已声明但未分配的变量时,在 C 中会发生什么?
【发布时间】:2015-09-24 20:01:17
【问题描述】:

为什么下面的sn-p会导致随机数以printf打印到屏幕上,而putchar却总是输出1?

#include <stdio.h>

int main() {
    char c;

    printf("%d\n", c );
    putchar(c);
}

【问题讨论】:

  • 你明白为什么吗?
  • 你使用的是哪个编译器???
  • 有时了解Undefined Behaviour为什么会产生它所产生的结果可能具有教育意义,但根据定义,它不会总是以这种方式发生。
  • 您无法访问声明的变量。它必须被定义

标签: c


【解决方案1】:

根据 C99 标准,这是undefined behavior。让我们看看为什么:

第 6.7.8.9 节说

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

这适用于您的变量c,因为它具有自动存储持续时间,并且没有显式初始化。

第 J.2 节说

在以下情况下行为未定义:

...

具有自动存储持续时间的对象的值在它被使用时使用 不确定

这也适用于您的代码,因为当您将c 作为参数传递给printfputchar 时,您会读取c,而c 的值仍然不确定,因为它还没有被已分配。

【讨论】:

    【解决方案2】:

    1) c 变量首先具有一个随机值(默认/垃圾值),因为您声明但未将您的 char c 初始化为任何已定义的字母或您感兴趣的值(字符)。
    2) 接下来,您尝试打印 char c 的 %d(digit/decimal/numerical value),所以现在它为您提供了垃圾的转换值,该值在您声明 char c 时分配给 c首先。
    3) 最后,您尝试使用 putchar(c),它的行为再次类似,因为您的 char c 未初始化并且仍在被读取,因此重新尝试使用要打印到屏幕上的未确定值进行管理。 (因为同一个未初始化的字符变量 c 被作为参数传递给这两种打印)。

    是的,这 3 条语句理解起来有点笨拙,但它们是外行,可以帮助加快对您的这个查询的一些理解。

    请注意@bluemoon 对您的问题的第一条评论回复。仅这三个词对它们就具有巨大的敏感性和意义,以至于它还可以告诉您您在自己的代码(您的行为)中做错了什么。“未定义”(尝试将其与未初始化相关联) )。

    【讨论】:

    • 我也无法理解为什么你的问题一开始就不是自己的答案?...除非你通过一些关于变量行为和在屏幕上打印输出的基本信息,就像在您继续阅读任何语言的第 2 章之前,有几个“必做之事”。这些是大多数语言学习的第一课。然而,话虽如此,我对奇怪的学习模式持开放态度,因为它有时(尽管可能很少)会产生意想不到的有趣观察。因此我还是回答了,但这一次扼杀了我的希望。
    • 我已经编码了一段时间。不过我现在才学习C。我是故意这样做的,因为我想知道会发生什么,并认为编译器可能会抛出错误。如果没有,我转向网络寻求答案。
    • @Daniel 我也是 C/C++ 的初学者......我可以分享的经验是......尝试各种排列和组合与未知/可疑的事情通常会给你一个确定的模式,而那个“确定的模式”就是所谓的“定义”(答案)这个词,对于某些事情。 Newaz,我希望答案能帮助您理解我最终关心的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-31
    • 1970-01-01
    • 2016-12-28
    • 2011-07-06
    • 1970-01-01
    相关资源
    最近更新 更多