假设我们在C:
中声明int a;
它的值未定义(让我们忘记那些默认设置为零的编译器)。但是这个未定义的值是否仍然具有变量的数据类型(整数)?
可能是a=19382
,a=23
,a=-33332
...但不是a=33.2
?
这对我来说听起来很合乎逻辑,但不确定。
答案 0 :(得分:5)
由于你没有初始化它,虽然a
将消耗与初始化int
相同的内存量,但内容是不确定的。
编译器必须将其视为int
,因此它可以具有任何整数值。它不能是33.2,因为它不是int
。但是,在某些架构中,它可能会包含一个“陷阱值”'这会在您尝试访问“a”时导致错误。另外,我无法想到int的任何示例,尽管浮点数确实具有称为'信令NANs'如果你尝试将无效指针加载到地址寄存器中,一些架构会陷阱。
答案 1 :(得分:4)
当它归结为任何变量的按位表示时,仅通过查看该级别,您无法判断它是int
,float
还是其他任何变量。这就是为什么需要变量的关联数据类型来理解和表示类型。
因此,当变量具有不确定值时,它是不确定的。它是否与变量的类型相同,没有多大意义,恕我直言。
只是为了说明一点(严格来说不是),你没有办法检查未初始化变量的值,因为,试图使用( read)该值将生成undefined behaviour。
答案 2 :(得分:2)
该值未定义,因此使用它是未定义的行为。它可能是int
,但它也可能有一个不是int
的合法代表的位模式。
在实践中,它不太可能具有int
的合法表示的位模式,但c并不能保证您对此有所了解。
但永远不会 类型,因为您提供的类型决定了如何解释存储的位模式。
答案 3 :(得分:0)
如果在函数之外声明普通的int,它将被初始化为0.这是由C标准保证的,并且如果你的编译器(实际上是编译器链接它的运行时库)没有将它设置为零,那它有一个seroius错误。
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf第6.7.9节第10段。
如果它在函数内部声明,它将具有不确定的值,并且访问它可能会导致可怕的未定义行为。