1

我是 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) 整数 i;在 for 循环和 int i=0 之外;成为不同的变量,即 for 循环 i 一旦大括号关闭就超出范围

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

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

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

是这种情况吗,这是否特定于 for 循环,或者是否有其他情况发生这种情况(我想不出其他任何情况,但嘿,我是新来的)

谢谢

4

4 回答 4

3

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

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

于 2012-12-28T11:32:29.600 回答
2

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

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

于 2012-12-28T13:11:55.257 回答
0

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

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

于 2012-12-28T11:14:30.913 回答
0

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

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

int i=0;  //  initialize i
std::cin >> i;
于 2012-12-28T11:24:56.373 回答