定义整数(int);默认值是多少?

问题描述 投票:0回答:7
int i;
int data[5] = {0};
data[0] = i;

data[0] 的值是多少?

另外,这一行是什么意思?

if (!data[0]) { ... }
c int
7个回答
28
投票

在大多数情况下,

int
对象没有“默认”值。

如果您将

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

在声明任何对象时显式初始化它是一个好习惯。


9
投票

取决于代码写在哪里。考虑:

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) { ... }

5
投票

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


4
投票

如果一个整数没有被初始化,它的值是未定义的 C


3
投票

因为你已经包含了

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


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

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(返回)键退出程序。

© www.soinside.com 2019 - 2024. All rights reserved.