当我运行以下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循环中并且我的范围已经在循环之后完成了所以为什么我得到在执行第二个cout语句之后,outpout i = 11.我没有在main里面的变量声明中声明i。我的问题是我在for循环之外是否可见? 提前谢谢。
答案 0 :(得分:4)
由于多种原因,此程序无法编译。您使用的是非常旧的编译器,非常宽松的编译器,或者没有向我们展示您实际遇到问题的程序。
从您的评论看来,您实际上可以编译它。我只能猜测你使用的是非常旧的编译器。也许一个旧的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;
语句进行编译:
#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
。这种情况发生的原因非常明显。为i
测试失败,i <= 10
必须具有什么价值?为什么,任何大于10的值!由于i
每次循环迭代都添加了一个,因此第一个值i
具有大于10的属性为11。
循环测试发生在循环的顶部,用于决定是否应该执行循环的其余部分。增量发生在循环的最底部(尽管出现在for
语句的主体中)。因此i
将为10,将被打印,然后将添加1。然后将完成循环测试(i <= 10
),将发现11&lt; = 10为假,并且循环后控制将从循环中退出到print语句,{{1}将被打印。
是的,完全相同的事情会在C中发生。
答案 1 :(得分:1)
因为当条件i<=10
变为 untrue 时循环中断,并且当i
变为11
时可能会发生这种情况。简单!
我想你想写i < 10
。
另外,正如@Omnifarious在评论中指出的那样,代码甚至不应该编译,因为i
在循环之外不存在。也许,你已经在原始代码中在循环之外声明了i
?
答案 2 :(得分:1)
除了它不应该编译(因为 i 在循环块之外不存在)。
循环从1到10运行,因此当 i 达到11并且条件失败时它会停止。所以 i 在循环结束时是11。
答案 3 :(得分:1)
这是因为你有一个旧的编译器。
cout<<i<<endl;
不应该编译,因为cout
和endl
需要由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;
?
<强>建议强>
std::cout << i;
i
变量循环范围,与原始代码一样我的建议的结果是,您只会看到1
到10
打印出来,并且您将来会有意外惊喜(因为一些“不好”和令人惊讶的代码不会甚至编译)。