[英]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;
不应编译,因为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
打印内容,并且在将来,您会有比预期少的意外惊喜(因为某些“不良”和令人惊讶的代码甚至无法编译)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.