增加未初始化的变量合法吗?

nic*_*day -3 c++

int main() {
 int i;
 i++; // 1
}
Run Code Online (Sandbox Code Playgroud)

我可以确定使用增量后总是得到值“ 1”吗?因为我经常听到变量在初始化之前可以包含任何内容。那是非法的吗?还是如果变量未初始化,增量总是从“ 0”开始?

0x4*_*2D2 7

如果未为对象指定初始化程序,则该对象将被默认初始化。当获得具有自动或动态存储持续时间的对象的存储时,该对象具有不确定的值,并且如果未对该对象执行初始化,则该对象将保留不确定的值,直到替换该值为止

整数的默认初始化为空操作,表示不执行任何初始化。这意味着i在您的示例中具有不确定的值。像具有值一样使用对象会导致未定义的行为:

如果评估产生不确定的值,则行为是不确定的[..]


hal*_*lat 5

它不一定是未定义的行为,因为它在很大程度上取决于语言的版本——然而,在 C++14 中事情要清楚得多。但是,无论哪种方式,都不能保证您将获得值 1。

  • int i;在此上下文中声明i具有自动存储持续时间和默认初始化。对于int,默认初始化使变量具有不确定的值。
  • 在 C 中,标准中定义了不确定值i将有一些值,或陷阱表示。
  • 增量操作将 的值加一i,这是不确定的。如果它碰巧是一个陷阱表示,这可能会引发一个信号。(在典型的 PC 硬件和 C 或 C++ 编译器上,不会有任何陷阱表示int。)
  • 在 C++14 草案之前,C++ 对不确定的含义保持开放;它被使用,但没有定义。曾经可能认为它与 C 标准中的含义相同,但坦率地说,这里没有任何保证。
  • 在 C++14 中,这已经被确定下来,除了对窄字符进行有限数量的操作外,对不确定值执行任何操作都会导致未定义的行为。

简而言之:如果它是 C,它不是未定义的行为,但没有承诺它将是 1;如果它是 C++14 之前的 C++,标准中没有正确指定,但至少,没有承诺它将是 1;并且在 C++14 中指定这是未定义的行为。

在 stackoverflow 上有一个有趣且内容丰富的讨论讨论了 C++ 中不确定的含义。