增加非初始化变量是否合法?

时间:2015-02-16 23:10:03

标签: c++

int main() {
 int i;
 i++; // 1
}

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

5 个答案:

答案 0 :(得分:6)

  

如果没有为对象指定初始值设定项,则默认初始化该对象。存储对象时   获得自动或动态存储持续时间,该对象具有不确定的值,如果   没有对该对象执行初始化,该对象保留一个不确定的值,直到该值为止   取代

整数的默认初始化是无操作,意味着不执行初始化。这意味着您的示例中的i具有不确定的值。使用该对象就好像它有一个值会导致未定义的行为:

  

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

答案 1 :(得分:3)

不会有未定义的行为。

i ++不是从0开始,它只是根据前一个值递增1,在这种情况下,我有不确定的值。

请参阅t his question了解更多详情

答案 2 :(得分:3)

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

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

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

在stackoverflow上,C ++中的不确定性意味着interesting and informative discussion

答案 3 :(得分:0)

只有全局变量初始化为零。这个是在函数内部定义的,它不是静态的,因此它是本地的。这意味着i在创建后包含随机垃圾。

答案 4 :(得分:0)

在现实世界中没有实际用途。这将给您不确定的行为。每次您将获得不同的值。