int main() {
int i;
i++; // 1
}
Run Code Online (Sandbox Code Playgroud)
我可以确定使用增量后总是得到值“ 1”吗?因为我经常听到变量在初始化之前可以包含任何内容。那是非法的吗?还是如果变量未初始化,增量总是从“ 0”开始?
如果未为对象指定初始化程序,则该对象将被默认初始化。当获得具有自动或动态存储持续时间的对象的存储时,该对象具有不确定的值,并且如果未对该对象执行初始化,则该对象将保留不确定的值,直到替换该值为止
整数的默认初始化为空操作,表示不执行任何初始化。这意味着i在您的示例中具有不确定的值。像具有值一样使用对象会导致未定义的行为:
如果评估产生不确定的值,则行为是不确定的[..]
它不一定是未定义的行为,因为它在很大程度上取决于语言的版本——然而,在 C++14 中事情要清楚得多。但是,无论哪种方式,都不能保证您将获得值 1。
int i;在此上下文中声明i具有自动存储持续时间和默认初始化。对于int,默认初始化使变量具有不确定的值。i将有一些值,或陷阱表示。i,这是不确定的。如果它碰巧是一个陷阱表示,这可能会引发一个信号。(在典型的 PC 硬件和 C 或 C++ 编译器上,不会有任何陷阱表示int。)简而言之:如果它是 C,它不是未定义的行为,但没有承诺它将是 1;如果它是 C++14 之前的 C++,标准中没有正确指定,但至少,没有承诺它将是 1;并且在 C++14 中指定这是未定义的行为。
在 stackoverflow 上有一个有趣且内容丰富的讨论,讨论了 C++ 中不确定的含义。