繁体   English   中英

C ++用于变量范围

[英]C++ for variable scope

我是c ++的新手,遇到过这个:

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

    int i;
    std::cin >> i;

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

现在我期待

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

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

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

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

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

谢谢

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

我经常使用原理当有疑问时,打印出更多 如果你使用std::cout << i ,那么你应该看到在打印输出点的范围内的i实际值。

嗯,很多答案,甚至一个被选为“解决方案”。

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

你想要这个选项:

/Zc:forScope,wchar_t

for -scope和内置的wchar_t类型启用标准C ++,你想要这个:

/GR

它启用RTTI(即dynamic_casttypeid )。

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

/entry:mainCRTStartup

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

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

但无论如何,总结一下,你for范围感到奇怪的原因很可能是由于编译器和/或Visual Studio项目 违约 已经设置为旧的预标准规则,并且选项为/Zc:forScope

假设的一致性(以及在这一点上编译器不符合标准将很可能给编译错误),你的两个i是有区别的。 但是没有什么能阻止编译器为两者使用相同的内存位置,因为它们的实时时间也是不同的,因此在这种情况下,预期第二个i以第一个的最终值开始,因为它没有被初始化。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM