Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.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 - Fatal编程技术网

当您打印一个声明但未分配的变量时,在C中会发生什么?

当您打印一个声明但未分配的变量时,在C中会发生什么?,c,C,为什么以下代码段会导致随机数以printf打印到屏幕上,但putchar总是输出1 #include <stdio.h> int main() { char c; printf("%d\n", c ); putchar(c); } #包括 int main(){ 字符c; printf(“%d\n”,c); 普查尔(c); } 根据C99标准,这是。让我们看看原因: 第6.7.8.9节规定 如果没有显式初始化具有自动存储持续时间的对象,则其值是不确定的

为什么以下代码段会导致随机数以
printf
打印到屏幕上,但
putchar
总是输出1

#include <stdio.h>

int main() {
    char c;

    printf("%d\n", c );
    putchar(c);
}
#包括
int main(){
字符c;
printf(“%d\n”,c);
普查尔(c);
}

根据C99标准,这是。让我们看看原因:

第6.7.8.9节规定

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

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

第J.2节说

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

具有自动存储持续时间的对象的值将在其运行时使用 不确定


这也适用于您的代码,因为当您将它作为参数传递给
printf
putchar
时,您会读取
c
,而
c
的值仍然是不确定的,因为它尚未被赋值。

根据C99标准,这是不确定的。让我们看看原因:

第6.7.8.9节规定

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

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

第J.2节说

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

具有自动存储持续时间的对象的值将在其运行时使用 不确定

这也适用于您的代码,因为当您将它作为参数传递给
printf
putchar
时,您会读取
c
,而
c
的值仍然是不确定的,因为它尚未被赋值。

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

是的,这3条语句理解起来有点笨拙,但它们尽可能的通俗易懂,有助于加快对您的查询的理解。

请注意@bluemoon对您问题的第一条评论回复。仅这三个词就具有极大的敏感性和意义,它还可以告诉您在自己的代码(您的操作)中犯了哪些错误。“未定义”(尝试将其与未初始化关联)。

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

是的,这3条语句理解起来有点笨拙,但它们尽可能的通俗易懂,有助于加快对您的查询的理解。


请注意@bluemoon对您问题的第一条评论回复。仅这三个词就具有极大的敏感性和意义,在某种程度上,它还告诉你在你自己的代码(你的行为)中犯了什么错误.

发生。您知道为什么吗?您使用的是哪种编译器???有时,了解未定义的行为为何会产生它所产生的结果是有教育意义的,但根据定义,它不会总是以这种方式发生。您无法访问已声明的变量。它必须被定义。发生。您知道为什么吗?您使用的是哪种编译器???有时,了解未定义的行为为何会产生它所产生的结果是有教育意义的,但根据定义,它不会总是以这种方式发生。您无法访问已声明的变量。它必须被定义。我也不明白为什么你的问题一开始就不是一个答案?。。。除非您在进入任何语言的第2章之前,已经阅读了一些关于变量行为和在屏幕上打印输出的基本信息,这些信息类似于一些“必须做的事情”。这些是大多数语言学习的第一堂课。然而,我已经说过,我对奇怪的学习模式持开放态度,因为有时(尽管可能很少)会产生出人意料的有趣的观察结果。所以我还是回答了,但这一次也扼杀了我的希望。我已经编写了一段时间了。不过我现在正在学C。我故意这样做是因为我想知道会发生什么,并且认为编译器可能会抛出一个错误。当它没有出现时,我转向网络寻求答案。@Daniel我也是C/C++的初学者……我可以分享的经验是……尝试各种未知/可疑事物的排列和组合通常会给你一个确定的模式,而“确定的模式”