首页 > 解决方案 > 在封闭范围内重新声明变量是未定义的行为吗?

问题描述

#include <iostream>
using namespace std;

int main() {
    int i = 0;
    if(true) {
        int i = 5;
        cout << i << '\n';
    }
    return 0;
}

尝试在 Ideone 上运行上述代码以查看其是否合法。结果让我感到困惑:

正如您从我的链接中看到的那样,每次在 Ideone 上编译相同的代码时,它的行为都完全不同!这闻起来像未定义的行为 (UB)。

OK C++ 以其不直观的行为而闻名,但是!- 我承认这只是我的直觉,但我不希望 C++ 在内部范围 UB 中重新声明一个变量!我期望阴影或强制编译错误。

根据 C++ 标准,我的代码真的是 UB,还是只是 Ideone 和/或 gcc 的特性?如果是 UB,是因为我重新声明了 UB,还是由于i其他原因我现在没有注意到?

标签: c++undefined-behavior

解决方案


在封闭范围内重新声明变量是否是UB?

不它不是。

i您看到的编译器错误很可能是由外部已声明但未使用的事实引起的。

否则,您的代码就可以了。

它在https://ideone.com/AwVJqZ以及我的桌面上对我来说都很好。


推荐阅读