繁体   English   中英

C ++中的变量声明

[英]Variable declaration in c++

当我运行以下c ++代码时

#include<iostream>

int main()
{
   for(int i=1;i<=10;i++)
   {
       cout<<i<<endl;
   }
   cout<<i;

   getch();
   return 0;
}

我从否得到结果。 1至11

我不明白为什么for循环的块完成后i = 11的值,请给我个理由。我已经在for循环中声明了i,而我的作用域在循环后已经完成了,所以为什么我得到输出i在执行第二条cout语句后= 11。我没有在main内部的变量声明中声明i。我的问题是我在for循环之外可见吗? 提前致谢。

由于多种原因,该程序无法编译。 您使用的是非常古老的编译器,非常宽松的编译器,或者没有向我们显示您实际上遇到问题的程序。

从您的评论看来,您实际上可以对其进行编译。 我只能猜测您使用的是非常旧的编译器。 也许是旧的MS-DOS编译器(Zortech C ++?Turbo C ++?),因为getch函数通常不是标准的库函数,并且在curses库中做不到正确的事情。 从MS-DOS时代开始,它可能是基于BIOS的旧功能。

该标准在不久前(现在已超过10年)进行了更改,因此for循环的括号部分中的变量声明是该循环的局部变量。 曾经并非如此,这确实是事实。

我再也无法访问任何这么老的编译器,无法以这种方式处理事情。 我很惊讶任何人。 您的程序无法在我的编译器上编译。

这是可以编译的程序版本,即使它需要-lcurses选项来链接:

#include <iostream>
#include <curses.h>

using ::std::cout;
using ::std::endl;

int main()
{
    for(int i=1;i<=10;i++)    
    {
        cout<<i<<endl;
    }

    getch();
    return 0;
}

注意有问题的提示cout << i; 声明不见了? 那是因为它将无法在现代编译器上进行编译。

现在,让我们对程序进行更多编辑,以使其与cout << i;一起编译cout << i; 令您烦恼的声明:

#include <iostream>
#include <curses.h>

int main()
{
    using ::std::cout;
    int i;

    for (i = 1; i <= 10; i++)
    {
        cout << i << '\n';
    }
    cout << "last: " << i << '\n';

    getch();
    return 0;
}

当然,这确实会last: 11打印出来last: 11 发生这种情况的原因非常明显。 i必须具有什么值才能使i <= 10测试失败? 为什么,任何大于10的值! 而且,由于i一个添加到它的每一个循环迭代,所述第一值由具有i有具有作为更大的比图10是11中的属性。

循环测试发生在循环的顶部,用于确定是否应执行循环的其余部分。 并且增量发生在循环的最底部(尽管出现在for语句的主体中)。 所以i将是10,将被打印,然后将1添加到它。 然后将执行循环测试( i <= 10 ),将发现11 <= 10为false,并且控制将在循环后从循环中退出到print语句,并last: 11

是的,完全相同的事情将在C语言中发生。

因为当条件i<=10 不成立时循环中断,所以当i变为11时可能会发生这种情况。 简单!

我想你想写i < 10

另外,正如@Omnifarious在评论中指出的那样,该代码甚至不应该编译,因为i不在循环之外。 也许,您已经在原始代码中将i声明在循环之外了?

除了它不应该编译的事实之外(因为不在循环块之外)。

循环从1到10运行,所以当达到11且条件失败时它停止。 所以在循环的结尾处是11。

这是因为您有旧的编译器。

cout<<i<<endl; 不应编译,因为coutendl需要由std名称空间限定。

解决这个问题, std::cout<<i; 不应编译,因为您的变量是循环作用域的,因此甚至在循环外部也不可见。

解决这个问题,这是您的代码:

#include<iostream>
#include<conio.h>

int main()
{
    int i;
    for(i = 1; i <= 10; i++)
    {
        std::cout << i << std::endl;
    }

    std::cout << i;

    getch();
    return 0;
}

现在应该清楚为什么打印11

i == 10 ,循环执行,使i递增,并检查其值。 然后等于11 ,因此退出循环。

然后,您还有另一个print语句,它将打印循环后的值11

这是从该更正程序得到的输出:

1个
2
3
4
5
6
7
8
9
10
11

这与您得到的相同。

如果您只想打印1-10 ,那么为什么要有额外的std::cout << i;

建议

  • 获取最新的C ++编译器,它将为您提供语法错误,这些错误在符合标准的C ++中不再有效
  • 摆脱多余的std::cout << i;
  • 保持您的i变量循环作用域,如原始代码所示

根据我的建议,结果是您只会看到110打印内容,并且在将来,您会有比预期少的意外惊喜(因为某些“不良”和令人惊讶的代码甚至无法编译)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM