我是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循环的特定情况还是有任何其他情况发生这种情况(我不能想到任何其他情况,但嘿,我是新的)
由于
答案 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_cast
和typeid
)。
为了达到标准,您还需要此链接器选项:
/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;