定义整数(int); 什么是默认值?

int i; int data[5] = {0}; data[0] = i; 

数据[0]的价值是多少?

另外,这条线的含义是什么?

 if (!data[0]) { ... } 

在大多数情况下, int对象没有“默认”值。

如果你声明int i; 作为函数内部的(非静态)局部变量,它具有不确定的值。 它是未初始化的,在您为其写入有效值之前不能使用它。

在声明任何对象时,明确初始化任何对象都是一个好习惯。

这取决于代码的编写位置。 考虑:

 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]的值是完全确定的; 它必须为零(假设没有其他任务干扰全局变量idata )。

相比之下, func2()设置的值完全不确定; 您无法可靠地说明将为data[0]分配的值,因为在函数中没有可靠地为i分配值。 它可能是来自某个先​​前函数调用的堆栈上的值,但这取决于编译器和程序,甚至不是“实现定义”; 它是纯粹的未定义行为。

你也问“这是什么意思?”

 if (!data[0]) { ... } 

! ‘运算符对其应用的值进行逻辑反转:它将零映射到一,并将任何非零值映射到零。 如果表达式求值为非零值,则整体条件的计算结果为true。 因此,如果data[0]为0,则!data[0]映射为1,并执行块中的代码; 如果data[0]不为0,则!data[0]映射为0,并且不执行块中的代码。

这是一种常用的习语,因为它比替代方案更简洁:

 if (data[0] == 0) { ... } 

如果未初始化整数,则其值根据C未定义

因为你已经包含了={0}; ,整个数组都用零填充。 如果这是在任何函数之外定义的,即使没有初始化器,它也会用零初始化。 if (!data[x])等于if (data[x] == 0)

如果一个整数被全局声明,那么它会自动初始化为零,但如果它是本地的,则包含垃圾值,直到并且除非给出一些值

//文件’a.c’

  #include  void main() { int i, j , k; printf("i = %ij = %ik = %i\n", i, j, k); } 

// 检测结果

 > $ gcc ac > $ ./a.out > i = 32767 j = 0 k = 0