int i;
int data[5] = {0};
data[0] = i;
data[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;
...
}
data[0]
中赋给func1()
的值是完全确定的;它必须为零(假设没有其他分配干扰全局变量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) { ... }
如果全局声明了一个整数,那么它会自动初始化为零 但如果它是本地的,则包含垃圾值,直到并且除非它被赋予了一些价值
如果一个整数没有被初始化,它的值是未定义的 C
因为你已经包含了
={0};
,所以整个数组都用零填充。如果这是在任何函数之外定义的,即使没有初始化器,它也会被初始化为零。 if (!data[x])
等同于 if (data[x] == 0)
.
// 文件 '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
正如@James McNellis 在 2010 年所说,编程语言的标准将变量的初始值留给编译器实现,并且结果因编译器实现而异。
我来这里是为了回顾这方面的事态,因为我记得观察到一些编译器将整数数组初始化为零。
阅读此处记录的不确定答案后,我在程序集中构建了一个小型静态方法,用于在生产代码中实现技术之前进行此类实验。我当前的项目需要将一些 JavaScript 代码移植到 C#。由于 JavaScript 解释器不初始化任何东西,该实现以 FOR 循环打开以初始化一个大的整数数组。在我盲目地将它留在 C# 实现中之前。
方法如下
private static void IntegerArrayGym ( )
{
int [ ] ints = new int [ 10 ];
Console.WriteLine ( $"{TEST_INTEGER_ARRAY_GYM} Begin:{Environment.NewLine}" );
int intArrayLength = ints.Length;
Console.WriteLine ( $" The test array consists of {ints} uninitialized integers.{Environment.NewLine}" );
for ( int intJ = ArrayInfo.ARRAY_FIRST_ELEMENT;
intJ < intArrayLength;
intJ++ )
{
Console.WriteLine ( $" Value of integer at ordinal position {ArrayInfo.OrdinalFromIndex ( intJ )} = {ints [ intJ ]}" );
} // for ( int intJ = ArrayInfo.ARRAY_FIRST_ELEMENT; intJ < intArrayLength; intJ++ )
Console.WriteLine ( $"{Environment.NewLine}{TEST_INTEGER_ARRAY_GYM} Done!" );
} // private static void IntegerArrayGym
输出如下。
CSharp_Lab,版本 7.92.170.0 开始@ 03/06/2023 22:58:49.124 (03/07/2023 04:58:49.124 UTC)
IntegerArrayGym 开始:
The test array consists of System.Int32[] uninitialized integers.
Value of integer at ordinal position 1 = 0
Value of integer at ordinal position 2 = 0
Value of integer at ordinal position 3 = 0
Value of integer at ordinal position 4 = 0
Value of integer at ordinal position 5 = 0
Value of integer at ordinal position 6 = 0
Value of integer at ordinal position 7 = 0
Value of integer at ordinal position 8 = 0
Value of integer at ordinal position 9 = 0
Value of integer at ordinal position 10 = 0
IntegerArrayGym 完成! 请按 ENTER(返回)键退出程序。