【问题标题】:Define integer (int); What's the default value?定义整数(int);默认值是多少?
【发布时间】:2010-12-26 05:28:19
【问题描述】:
int i;
int data[5] = {0};
data[0] = i;

data[0] 中的值是多少?

另外,这行是什么意思?

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

【问题讨论】:

    标签: c int


    【解决方案1】:

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

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

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

    【讨论】:

    • @James McNellis,您的意思是“int type”,而不是 int 对象,对吧? :)
    • @Jacob:类型没有值。对象具有值。未显式初始化的对象在某些语言中可能具有某些默认值(在某些情况下,甚至在 C 中)。
    • @Jacob:因为这是您在特定时间使用具有特定设置的编译器编译程序时碰巧得到的结果。当我编译并运行该程序时,我得到了-858993460-858993460-858993460-858993460-858993460 的输出。您的编译器很可能正在为您零初始化内存。我的,具有标准调试构建设置的 Visual C++,正在使用 0xcc 预初始化未初始化的对象,以便更容易检测到它们。
    • @Jacob 你很幸运,或者你的编译器实现了一个默认值零。但是 ANSI C 规范没有为非静态数据成员指定默认值。而且我也从未见过编译器规范以这种方式定义它。
    • @Jacob:C 和 C++ 中的“对象”只是“存储区域”。它是代表某事的字节序列。
    【解决方案2】:

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

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

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

    这是一个常用的成语,因为它比替代词更简洁:

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

    【讨论】:

    • 我真的不明白为什么你说在 func1 中分配给 data[0] 的值是完全确定的。只要 i 没有被初始化,它似乎 100% 不确定
    • @Julius:在func1() 的上下文中,i 是一个全局变量,全局(int)变量被初始化为 0,除非指定了其他初始化程序。 (对于其他一些类型,情况稍微复杂一些,但所有全局变量都被初始化,要么设置为指定值,要么设置为“零”。)现在,如果其他一些代码修改了 i 的值,则分配的值到data[0] 不一定是0,但值仍然是定义的,不是不确定的。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • data[0] 随后被设置为i。 OP 归结为询问 i 的值是什么,因为它没有被分配一个。
        【解决方案6】:

        // 文件'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
        

        【讨论】:

        • 有人能解释一下这个输出吗?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-20
        • 2018-07-12
        • 2015-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多