C ++用于变量范围

时间:2012-12-28 10:55:44

标签: c++ visual-studio-2010 scope

我是c ++的新手,并且遇到过这个问题:

    for (int i=0 ; i<500 ; i++) {
        //to do
    }

    int i;
    std::cin >> i;

更新:使用visual studio 2010(及其使用的编译器),for循环外的i在调用cin&gt;&gt;之后的值为500一世;我正在使用Visual Studio调试器&lt;&lt;&lt;&lt;&lt;&lt; (这是问题 - 谢谢Greg)

现在我期待

a)int i;在for循环之外,int i = 0;成为不同的变量,即一旦大括号关闭,for循环i就会超出范围

b)一旦我意识到它没有超出范围,我就想知道为什么它没有被cin覆盖。

我认为b)是故意的(虽然我在Bjarne Stroustrup的c ++书中找不到页面时遇到了麻烦)但我确信它在同一本书中指出变量的范围在它们所包含的括号内。

在大多数其他语言中,我知道在for构造中声明变量时,它们被认为是for循环的大括号,但在c ++中似乎并非如此。

是这种情况并且这是针对for循环的特定情况还是有任何其他情况发生这种情况(我不能想到任何其他情况,但嘿,我是新的)

由于

4 个答案:

答案 0 :(得分:3)

在某些情况下,特别是在同一个函数中有两个不同变量且名称相同的情况下,您无法始终信任调试器来为您提供正确的信息。如果您要求i的值,调试器可能无法确切知道您所指的i。根据您的描述,听起来编译器为i的每个不同实例分配了两个不同的内存位置。

我经常使用原则如果有疑问,请打印出更多。如果您使用std::cout << i,那么您应该会在打印输出的位置看到i实际值。

答案 1 :(得分:1)

嗯,很多答案,甚至一个被选为&#34;解决方案&#34;。

但无论如何,Visual C ++ 10.0(Visual Studio 2010附带的编译器)的问题是它默认为它可以配置为预标准行为,其中声明变量的范围在for循环中,扩展了循环放置的块。

你想要这个选项:

/Zc:forScope,wchar_t

启用标准C ++ for - 范围以及内置wchar_t类型,您想要这样:

/GR

启用RTTI(即dynamic_casttypeid)。

为了达到标准,您还需要此链接器选项:

/entry:mainCRTStartup

为GUI子系统程序启用C ++标准main,当然你想启用异常处理,但我记得默认情况下启用的Visual C ++项目(尽管不是为了命令行编译器。)

此外,当然,您希望通过/W4启用尽可能多的警告,尽管这与标准一致性无关。

但无论如何,总结一下,你得到奇怪的for范围的原因很可能是由于编译器和/或Visual Studio项目默认已被设置为旧的预标准规则,以及它的选项是/Zc:forScope

答案 2 :(得分:0)

假设一致性(并且编译器不符合该点很可能会产生编译错误),那么您的两个i是不同的。但是没有什么能阻止编译器为两者使用相同的内存位置,因为它们的实时时间也是不同的,因此第二个i从第一个的最终值开始,因为它没有被初始化,这是预期的那种情况。

cin >> i不允许您输入新值的事实与此无关。并且你没有提供足够的信息来做更多的事情而不是猜测一个原因(我的猜测是流处于错误状态)。

答案 3 :(得分:0)

我认为它发生的原因是第二个i没有初始化,编译器对第二个i使用相同的内存块。 它们仍然是两个不同的变量。是的,第一个我被舀到循环。 因此它是未定义的,你不能指望第二个我是500。

for (int i=0 ; i<500 ; i++) {
    //to do
}

int i=0;  //  initialize i
std::cin >> i;