【发布时间】:2010-12-26 05:28:19
【问题描述】:
int i;
int data[5] = {0};
data[0] = i;
data[0] 中的值是多少?
另外,这行是什么意思?
if (!data[0]) { ... }
【问题讨论】:
int i;
int data[5] = {0};
data[0] = i;
data[0] 中的值是多少?
另外,这行是什么意思?
if (!data[0]) { ... }
【问题讨论】:
在大多数情况下,int 对象没有“默认”值。
如果您将int i; 声明为函数内部的(非静态)局部变量,则它具有不确定的值。它是未初始化的,在你写入一个有效值之前你不能使用它。
在声明对象时明确初始化任何对象是一个好习惯。
【讨论】:
int type”,而不是 int 对象,对吧? :)
-858993460-858993460-858993460-858993460-858993460 的输出。您的编译器很可能正在为您零初始化内存。我的,具有标准调试构建设置的 Visual C++,正在使用 0xcc 预初始化未初始化的对象,以便更容易检测到它们。
这取决于代码的编写位置。考虑:
int i;
int data[5] = {0};
void func1(void)
{
data[0] = i;
}
void func2(void)
{
int i;
int data[5] = {0};
data[0] = i;
...
}
func1() 中分配给data[0] 的值是完全确定的;它必须为零(假设没有其他赋值干扰全局变量 i 和 data 的值)。
相比之下,func2() 中设置的值是完全不确定的;您无法可靠地说明将分配给data[0] 的值,因为在函数中没有可靠地为i 分配值。它可能是之前某个函数调用在堆栈上的值,但这取决于编译器和程序,甚至不是“定义的实现”;这是纯粹的未定义行为。
你还问“这是什么意思?”
if (!data[0]) { ... }
'!' 运算符对其应用的值进行逻辑反转:它将零映射到一,并将任何非零值映射到零。如果表达式的计算结果为非零值,则整体条件的计算结果为真。因此,如果data[0] 为0,则!data[0] 映射为1,并执行块中的代码;如果data[0] 不为0,则!data[0] 映射为0,块中的代码不会被执行。
这是一个常用的成语,因为它比替代词更简洁:
if (data[0] == 0) { ... }
【讨论】:
func1() 的上下文中,i 是一个全局变量,全局(int)变量被初始化为 0,除非指定了其他初始化程序。 (对于其他一些类型,情况稍微复杂一些,但所有全局变量都被初始化,要么设置为指定值,要么设置为“零”。)现在,如果其他一些代码修改了 i 的值,则分配的值到data[0] 不一定是0,但值仍然是定义的,不是不确定的。
如果一个整数没有被初始化,那么它的值是根据 C 定义的
【讨论】:
如果一个整数被全局声明,那么它会自动初始化为零 但如果它是本地的,则包含垃圾值,除非它被赋予了一些价值
【讨论】:
由于您已包含={0};,因此整个数组都被零填充。如果这是在任何函数之外定义的,即使没有初始化器,它也会用零初始化。 if (!data[x]) 等价于if (data[x] == 0)。
【讨论】:
data[0] 随后被设置为i。 OP 归结为询问 i 的值是什么,因为它没有被分配一个。
// 文件'a.c'
#include <stdio.h>
void main()
{
int i, j , k;
printf("i = %i j = %i k = %i\n", i, j, k);
}
//测试结果
> $ gcc a.c
> $ ./a.out
> i = 32767 j = 0 k = 0
【讨论】: