定义整数(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]
的值是完全确定的; 它必须为零(假设没有其他任务干扰全局变量i
和data
)。
相比之下, 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