C 为什么以下程序的输出是如何r u的?

C 为什么以下程序的输出是如何r u的?,c,if-statement,C,If Statement,以下代码是if-else条件语句的基本实现- #include <stdio.h> #include <stdlib.h> int x; int main() { if(x) printf("hi"); else printf("how r u \n"); return 0; } #包括 #包括 int x; int main() { if(x) printf(“hi”); 其他的 printf(“how r\n

以下代码是
if-else
条件语句的基本实现-

#include <stdio.h>
#include <stdlib.h>
int x;
int main() 
{
    if(x)
        printf("hi");
    else
        printf("how r u \n");
    return 0;
}
#包括
#包括
int x;
int main()
{
if(x)
printf(“hi”);
其他的
printf(“how r\n”);
返回0;
}
6.9.2外部对象定义

语义

1如果对象标识符的声明具有文件作用域和初始值设定项,则 声明是标识符的外部定义

2具有文件作用域但没有初始值设定项的对象的标识符声明,以及 如果没有存储类说明符或存储类说明符为static,则构成 暂定定义。如果翻译单元包含一个或多个暂定定义 标识符,并且翻译单元不包含该标识符的外部定义 该行为与翻译单元包含该转换单元的文件范围声明完全相同 标识符,复合类型在翻译单元末尾,带有初始值设定项 等于0


因此,全局变量永远不会保持未初始化状态,它们总是初始化为
0
。因此,输出
如何r u

//全局 int x


您已将“x”声明为全局变量。。。因此,它的默认值为0。

根据C标准,您的代码不会触发未定义的行为:

如果没有显式初始化具有静态或线程存储持续时间的对象,则:
-如果有指针类型,则初始化为空指针
-如果它有算术类型,则初始化为(正或无符号)零

这取自C11标准,但C89和C99也定义了这种行为:

如果没有显式初始化具有静态存储持续时间的对象,则会隐式初始化该对象,就像为具有算术类型的每个成员分配了0,并且为具有指针类型的每个成员分配了空指针常量一样

因为您将
x
声明为全局变量,所以它具有静态存储持续时间,因此
x
保证初始化为
0
(它是一个int,显然有一个算术类型)

因此,您的主要功能如下所示:

int main(void)//use int main(void), not int main() 
{
    if(0)//x is 0, 0 is false
        printf("hi");
    else
        printf("how r u \n");//because if (x) is false, this is executed
    return 0;
}

这就是为什么程序的输出将是“How r u”。

全局范围变量初始化为0,即false。如果在main()中声明了“x”,那么它应该是UB。
x
是一个全局变量,静态存储。它保证初始化为0@EliasVanOotegem,我的错。我错过了。诚实的错误:)我的回答中包含了C标准的相关部分,这意味着我很抱歉,但这个答案完全是错误的:全局变量是初始化的,堆栈变量在初始化之前不包含“由另一个程序”使用的值。这不是垃圾。未初始化的全局变量进入BSS段。它们被初始化为零。