为什么以下代码段会使用printf
将随机数打印到屏幕上,但putchar
始终输出1?
#include <stdio.h>
int main() {
char c;
printf("%d\n", c );
putchar(c);
}
答案 0 :(得分:4)
根据C99标准,这是undefined behavior。让我们看看为什么:
第6.7.8.9节说
如果没有显式初始化具有自动存储持续时间的对象,则其值是不确定的。
这适用于您的变量c
,因为它具有自动存储持续时间,并且未明确初始化。
第J.2节说
在以下情况下,行为未定义:
...
使用具有自动存储持续时间的对象的值 不确定
这也适用于您的代码,因为当您将c
作为参数传递给printf
和putchar
时,您会看到c
,而<div id="slider-gif"></div>
的值是仍然不确定,因为它还没有被分配。
答案 1 :(得分:2)
1)c变量首先对你自己声明了一个随机值(默认/垃圾值),但是你没有将你的charc初始化为任何定义的字母或你感兴趣的字符(字符)。
2)接下来你试图打印char c的%d(数字/十进制/数值),所以现在它给你一个转换后的垃圾的值,当你声明了char时,它已经被分配给了c c首先。
3)最后你尝试使用putchar(c),它的行为类似,因为你的char c未初始化并且仍然被读取,因此重新尝试管理未确定的值以打印到屏幕上。 (因为同一个未初始化的字符变量c作为参数传递给两种打印方式)。
是的,这3个陈述有点笨拙无法理解,但它们就像外行一样,可以帮助加快对你的查询的一些理解。
注意@bluemoon对你的问题的第一个评论回复。单独的这3个单词对他们来说具有很大的敏感性和意义,并且它还告诉你在你自己的代码中你做错了什么(你的行为)。&#34;未定义&#34;(尝试将其与UNINITIALIZED相关联。)