int i;
int data[5] = {0};
data[0] = i;
Run Code Online (Sandbox Code Playgroud)
数据[0]的价值是多少?
另外,这条线的含义是什么?
if (!data[0]) { ... }
Run Code Online (Sandbox Code Playgroud)
Jam*_*lis 20
在大多数情况下,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;
...
}
Run Code Online (Sandbox Code Playgroud)
分配给值data[0]中func1()是完全确定的; 它必须是零(假定没有其他任务都与全局变量的值,干扰i和data).
相比之下,设定的值func2()是完全不确定的; 您无法可靠地说明将分配给哪个值,data[0]因为函数中没有可靠i的值.它可能是来自某个先前函数调用的堆栈上的值,但这取决于编译器和程序,甚至不是"实现定义"; 它是纯粹的未定义行为.
你也问"这是什么意思?"
Run Code Online (Sandbox Code Playgroud)if (!data[0]) { ... }
' !'运算符对其应用的值进行逻辑反演:它将零映射到一,并将任何非零值映射到零.如果表达式求值为非零值,则整体条件的计算结果为true.因此,如果data[0]为0,则!data[0]映射为1并执行块中的代码; 如果data[0]不为0,则!data[0]映射到0并且不执行块中的代码.
这是一种常用的习语,因为它比其他选择更简洁:
if (data[0] == 0) { ... }
Run Code Online (Sandbox Code Playgroud)