visualstudio 2010-适用于可变作用域的C++

visual studio 2010 - C++ for variable scope

本文关键字:作用域 C++ 2010- 适用于 visualstudio      更新时间:2023-10-16

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

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

UPDATE:使用visualstudio2010(以及它使用的编译器(,在调用cin>>i之后,for循环外部的i的值为500;我正在使用Visual Studio调试器<lt;(这就是问题所在-谢谢Greg(

现在我期待

a( int i;在for循环外,int i=0;是不同的变量,即一旦括号关闭,循环i将超出范围

b( 当我意识到它没有超出范围时,我想知道为什么它没有被cin重写。

我认为b(是有意的(尽管我在Bjarne Stroustrup关于c++的书中很难找到它的页面(,但我确信它在同一本书中指出,变量在它们所包含的大括号内有作用域。

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

这种情况是这样的吗?这是for循环特有的吗?或者还有其他发生这种情况的情况吗(我想不出其他情况了,但嘿,我是新来的(

感谢

在某些情况下,特别是在同一函数中有两个同名的不同变量的情况下,您不能总是相信调试器会为您提供正确的信息。如果你要求i的值,调试器可能不知道你指的是哪个i。根据你的描述,编译器似乎为i的每个不同实例分配了两个不同的内存位置。

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

Hm,有很多答案,甚至有一个被选为"解决方案"。

但无论如何,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

假设一致性(编译器在这一点上不一致很可能会产生编译错误(,那么您的两个i是不同的。但是,没有什么能阻止编译器为两者使用相同的内存位置,因为它们的生存时间也不同,因此在这种情况下,第二个i以第一个的最终值开始是意料之中的事,因为它没有初始化。

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

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

for (int i=0 ; i<500 ; i++) {
    //to do
}
int i=0;  //  initialize i
std::cin >> i;