int i;
int data[5] = {0};
data[0] = i;
data [0]中的值是什么?
此外,这条线的含义是什么?
if (!data[0]) { ... }
答案 0 :(得分:20)
在大多数情况下,int
对象没有“默认”值。
如果在函数内部声明int i;
为(非静态)局部变量,则它具有不确定的值。它是未初始化的,在您为其写入有效值之前不能使用它。
在声明任何对象时,明确初始化任何对象都是一个好习惯。
答案 1 :(得分:8)
这取决于代码的编写位置。考虑:
int i;
int data[5] = {0};
void func1(void)
{
data[0] = i;
}
void func2(void)
{
int i;
int data[5] = {0};
data[0] = i;
...
}
data[0]
中分配给func1()
的值是完全确定的;它必须为零(假设没有其他任务干扰全局变量的值i
和data
)。
相比之下,func2()
中设定的值完全不确定;您无法可靠地说明将为data[0]
分配的值,因为在函数中没有可靠的值分配给i
。它可能是来自某个先前函数调用的堆栈上的值,但这取决于编译器和程序,甚至不是“实现定义”;这是纯粹的未定义行为。
你也问“这是什么意思?”
if (!data[0]) { ... }
'!
'运算符对其应用的值进行逻辑反演:它将零映射为1,并将任何非零值映射为零。如果表达式求值为非零值,则整体条件的计算结果为true。因此,如果data[0]
为0,则!data[0]
映射为1,并执行块中的代码;如果data[0]
不为0,则!data[0]
映射为0,并且不执行块中的代码。
这是一种常用的习语,因为它比另类更简洁:
if (data[0] == 0) { ... }
答案 2 :(得分:4)
如果未初始化整数,则其值根据C
未定义答案 3 :(得分:3)
由于您已包含={0};
,因此整个数组都填充了零。如果这是在任何函数之外定义的,即使没有初始化程序,它也会用零初始化。 if (!data[x])
相当于if (data[x] == 0)
。
答案 4 :(得分:3)
如果全局声明一个整数,那么它将自动初始化为零 但如果它是本地的,则包含垃圾值,直到并且除非给出一些值
答案 5 :(得分:1)
//文件'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