visualstudio 2010-适用于可变作用域的C++
visual studio 2010 - C++ for variable scope
我是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_cast
和typeid
(。
为了获得尽可能标准的链接器选项:
/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;
- 未在作用域中声明unordered_map
- 有没有一种方法可以在编译时获得作用域类名
- C++quit()函数中可能存在作用域问题
- 未在此作用域OpenCV3.4中声明cvSaveImage
- 全局作用域中函数指针的赋值
- 在类函数中初始化外部作用域变量
- 不同作用域中的静态变量和全局变量
- 是同一作用域的函数部分中的函数调用
- 未在此作用域中声明的函数和变量 (C++)
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- 将作用域枚举转换为基础类型
- 表达式必须具有完整或无作用域的枚举图
- 在构造函数中输入对象时C++类成员作用域
- 无法让"std::enable_if"适用于无作用域枚举
- 为什么不能直接引用作用域枚举类成员,而不能为无作用域枚举生成类成员?
- 函数未在作用域中声明 / 如何结合使用 header.h、header.cpp 和 main.cpp?
- 错误:表达式必须具有算术、无作用域枚举或带有运算符重载的指针类型
- 如何在C++中访问作用域的变量输出?
- 重载时未在 C++ 的作用域错误中声明
- 作用域枚举和标准::get