int main() {
int i;
i++; // 1
}
使用增量后,我能确定总是得到值“1”吗?因为我经常听到变量在初始化之前可以包含任何内容。所以这是非法的?或者,如果变量是未初始化的,则增量始终从“0”开始?
答案 0 :(得分:6)
如果没有为对象指定初始值设定项,则默认初始化该对象。存储对象时 获得自动或动态存储持续时间,该对象具有不确定的值,如果 没有对该对象执行初始化,该对象保留一个不确定的值,直到该值为止 取代
整数的默认初始化是无操作,意味着不执行初始化。这意味着您的示例中的i
具有不确定的值。使用该对象就好像它有一个值会导致未定义的行为:
如果评估产生不确定的值,则行为未定义[..]
答案 1 :(得分:3)
答案 2 :(得分:3)
它不一定是未定义的行为,因为它在很大程度上取决于语言的版本 - 然而,在C ++ 14中,事情要清晰得多。无论哪种方式,都无法保证您将获得值1。
int i;
使用自动存储持续时间声明i
,并使用默认初始化。对于int
,默认初始化会使变量保留 indeterminate 值。i
将具有一些值或陷阱表示。i
的值加1,这是不确定的。如果碰巧是陷阱表示,这可能会引发信号。 (在典型的PC硬件和C或C ++编译器上,不存在int
的任何陷阱表示。)简而言之:如果它是C,它不是未定义的行为,但没有承诺它将是1;如果它是预先C ++ 14 C ++,它在标准中没有正确指定,但至少,它没有承诺它将是1;在C ++ 14中,指定这是未定义的行为。
在stackoverflow上,C ++中的不确定性意味着interesting and informative discussion。
答案 3 :(得分:0)
只有全局变量初始化为零。这个是在函数内部定义的,它不是静态的,因此它是本地的。这意味着i
在创建后包含随机垃圾。
答案 4 :(得分:0)
在现实世界中没有实际用途。这将给您不确定的行为。每次您将获得不同的值。