【问题标题】:is null value is equal to zero(0)? [duplicate]空值是否等于零(0)? [复制]
【发布时间】:2018-11-17 17:18:49
【问题描述】:

一位程序员告诉我,如果我们不给任何变量赋值,例如 ma​​x,那么它就会被认为是空值。

{
    int max=0,x[5];
    for(int a=0;a<5;a++)
    {
        cout<<"Enter no "<<a+1<<" : ";
        cin>>x[a];
        if(max<x[a])
    {
        max=x[a];
    }

    }
    cout<<endl<<max;
}

输出:

Enter no 1 : 1
Enter no 2 : 5
Enter no 3 : 8
Enter no 4 : 7
Enter no 5 : 5

8

当类型 ma​​x=0 表示在声明中将 0 分配给 ma​​x

它给了我同样的结果,即 null value 等于 0。 如果是,那么 null value0

有什么区别

【问题讨论】:

  • “它给了我同样的结果” 什么给了你同样的结果?
  • 您的“程序员”以误导的方式混合概念。 C++ 中不存在由于未初始化变量而产生的“空值”。如果 int 未初始化,则评估其值会给出未定义的行为——这(松散地)意味着 C++ 标准没有定义会发生什么。您可以想象的任何评估结果在理论上都是可能的(垃圾值、零、重新格式化硬盘驱动器、如果代码是使用不同的编译器构建的则不同的值、随着月相变化的值等)。

标签: c++ null zero


【解决方案1】:

这实际上取决于您使用哪种编程语言编写代码。 例如,如果您在 c/c++ 中访问读取未初始化的变量,您将无法知道它将为您提供哪个值。 分配变量时内存不会归零,因此无论存在什么位,它们都将被读取为该变量类型中的值。

Game Maker 自己的语言 GML 允许您在编译时决定是否必须将未初始化的变量默认设置为 0;但是任何体面的程序员都会关闭该选项而不依赖它;我不知道其他自动初始化变量值的语言。

我会说依赖这样的功能是不好的做法。


关于 null 和 0 的区别,实际上取决于你的变量的基类型。 整数只能存储整数,所以 null 仍然可以作为整数读取。

【讨论】:

    【解决方案2】:

    如果您在自动存储中默认初始化一个基本类型的对象(例如int),则该值将是indeterminate。读取不确定值的行为是未定义的。

    未定义的行为意味着标准不会以任何方式限制程序的行为。就 C++ 标准而言,可能的行为包括,没有一个是保证的:

    • 您期望的输出。
    • 出乎意料的输出。
    • 与某些没有 UB 的程序的输出相同。
    • 与某些没有 UB 的程序的输出不同。
    • 任何输出。
    • 没有任何输出。
    • 您所期望的副作用。
    • 意想不到的副作用。
    • 任何副作用。
    • 没有任何副作用。
    • 可能的副作用包括:
      • 数据损坏。
      • 安全漏洞。
      • 进程能力范围内的任何内容,希望受到操作系统的限制。
    • 其他系统上的行为不一致。
    • 如果您使用其他编译器重新编译,即使在同一系统上也会出现不一致的行为。
    • 即使使用相同的编译器重新编译也会出现不一致的行为。
    • 即使在另一次执行期间没有重新编译,也会出现不一致的行为:
      • 可能仅在您度假时使用。
      • 可能仅当您向雇主或重要客户展示您的计划时。
    • 上述所有情况下的行为一致。

    一位程序员告诉我,如果我们不给任何变量赋值,例如 max,那么它就会被认为是空值。

    C++ 中没有空值整数这样的东西。有空指针之类的,也有空字符之类的,它们之间没有直接关系,也和未初始化的变量没有任何关系。

    您的程序员使用了令人困惑的术语,但如果 null value 表示 indeterminate value,那么它们是正确的。在这种情况下,您的问题变成不确定值和 0 之间有什么区别,答案是读取不确定值是未定义的行为(见上文)。

    当类型 max=0 表示在声明中将 0 分配给 max

    为了迂腐,你有int max=0,这不是赋值,而是初始化。

    【讨论】:

    【解决方案3】:

    c++ 中没有“空”值。局部原语是未初始化的(你会得到此时恰好在内存中的垃圾),而静态和全局变量是零初始化的。所以说int max; 你会得到随机垃圾或零(取决于你声明它的位置)。

    【讨论】:

    • 零恰好是另一个随机垃圾的可能性
    • @barnack - “那个零”是指在某些情况下默认初始化是零初始化,例如默认情况下,静态存储持续时间的int 初始化为零。 int max 在函数外部初始化为零。这不是“另一种随机垃圾的可能性”。
    猜你喜欢
    • 2012-11-28
    • 2011-03-09
    • 2019-12-23
    • 2016-04-06
    • 2020-09-20
    • 2016-12-17
    • 2022-01-13
    • 2020-08-22
    相关资源
    最近更新 更多