[英]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_cast
和typeid
)。
只是为了达到标准,您还需要此链接器选项:
/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.