我刚刚开始阅读《C 编程一种现代方法》一书,我有一个练习: 编写一个程序,声明几个 int 和 float 变量,但不初始化它们,然后打印它们的值。这些值有任何模式吗?(通常没有。)
我在 Dev C++ 5.11 中运行此代码
我的代码:
#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char *argv[]) {
int a,b,c,d,e,f,a1,a2,a3;
float x,y,z,x1,x2,x3;
printf("a:%d ,b:%d ,c:%d ,d:%d ,e:%d ,f:%d ,a1:%d ,a2:%d ,a3:%d \n x:%f ,y:%f ,z:%f ,x1:%f ,x2:%f ,x3:%f",a,b,c,d,e,f,a1,a2,a3,x,y,z,x1,x2,x3);
}
它们将具有不确定的值,这基本上意味着它们将具有任意值。
该值可能为零,也可能是其他值。该值在不同的运行中可能会有所不同,或者取决于程序早期发生的情况。
它甚至可能是具有这些陷阱的机器上的陷阱表示,在这种情况下读取它是未定义的行为。
C17 §6.7.9 ¶10 定义了当对象未显式初始化时会发生什么:
如果一个具有自动存储期限的对象没有显式初始化,那么它的值是不确定的。如果具有静态或线程存储持续时间的对象未显式初始化,则:
- 如果是指针类型,则初始化为空指针;
- 如果是算术类型,则初始化为(正数或无符号)零;
- 如果是聚合,则根据这些规则(递归地)初始化每个成员,并且任何填充都初始化为零位;
- 如果是联合体,则根据这些规则(递归地)初始化第一个命名成员,并且任何填充都初始化为零位;
C17 §3.19.2 ¶1 定义不确定值如下:
未指定的值或陷阱表示