根据我的说法,while循环应该是无限的,但它只运行三次
main()
{
int i=3;
while(i--)
{
int i=100;
i--;
printf("%d..",i);
}
}
输出99..99..99
但据我说,它应该运行无限次,因为每次控制进入循环时它获得值100.因此它永远不会达到零。
只是为了实验我在while循环中将int i=100;
替换为i=100;
,现在它运行无限次.WHY ???
答案 0 :(得分:7)
i
中的变量while(i--)
与循环中定义的变量i
不同。
基本上int i = 100
阴影上一个int i = 3
以及while
区块内你指的是一个新变量
在一天结束时,我发现没有合理的情况你需要做这样的事情。
答案 1 :(得分:7)
检查条件的变量i
是您在main()
中声明的变量而不是循环内的变量i
。
两者都是不同的变量,你把它们混为一体,编译器不会像你一样容易混淆。
循环内部{
指的是您在}
{
内声明但在}
i
之外main()
指的那个在{{1}}
答案 2 :(得分:5)
while(i--)
{
int i=100; // gets created every time the loop is entered
i--;
printf("%d..",i);
} // the i in the loop keeps getting destroyed here
为什么不尝试:
while(i--)
{
{
int i=100; //Visible only in this scope
i--;
printf("inner i=%d..",i);
} //gets destroyed here
printf("\nouter i=%d..\n",i);
}
答案 3 :(得分:2)
每个变量都是指其最新的声明(当然在该范围内有效):
main()
{
int i=3;
while(i--) // this i is the one defined in the line above
{
int i=100;
i--; // this i is the one defined in the line above
printf("%d..",i); // this i is the one defined two lines above
}
}
因此,你的while循环迭代3次,因为它取决于i
声明的int i = 3;
在循环中它打印99
因为i
引用了i
由int i = 100;
声明的--
,int i = 100;
。
如果您将i = 100
更改为i
,那么您正在更改第一个int a=4;
{
int a=10;
}
printf("%d", a);
而不会引入另一个变量。因此无限循环。
编辑有些人说,而不是“最近的”,我应该说“在当前范围内可访问的最内层声明”给出了这个例子:
a
由于printf
无法看到第二个printf("%d", a);
,显然{{1}}无法引用它。我假设读者知道一个变量只能在其定义的范围内访问。否则,是的,前两个注释中的短语更精确。
答案 4 :(得分:1)
C ++中的每个范围(粗略地说,每对未用于特殊目的的大括号,如数组初始化)可能包含自己的局部变量声明。在循环中编写int i = 100;
指定另一个名为i
的变量,该变量与循环外的变量不同,并导致范围内使用i
的代码默认情况下引用内部i
而不是外部的。但是,循环条件中的i--
仍然使用外部i
。
当你用int i = 100
替换i = 100
时,现在只有一个变量,它被设置为100,递减两次(一次在循环内,一次由循环本身),并重新设置到了100,反复。