关于c#:声明变量时’for’循环的范围

Scope of a 'for' loop at declaration of a variable

我在编码时遇到了这种奇怪的行为。所以我在这里问。

声明变量时,for循环的作用域是什么?

这段代码编译得很好

1
2
3
for (int i = 0; i < 10; i++) { }

for (int i = 0; i < 10; i++) { }

这意味着两个int i不在同一范围内。

但这段代码不能编译。

1
2
3
for (int i = 0; i < 10; i++) { }
int i; // Conflicts with both first loop and second one.
for (int i = 0; i < 10; i++) { }

这意味着循环中间的int i具有与第一个循环和第二个循环相同的范围。

但是在两个EDCOX1,0个循环中,EDOCX1?1的范围如何不同,但与EDCOX1中间的范围相同?1?因为我现在看到他们在同一水平。

我知道第二个代码不能编译。如果范围中存在问题,那么为什么要编译第一个代码呢?这是编译器内部的异常吗?


编译器不检查在另一个变量之前或之后申报的变量。所有的事情都是这个范围。如果你使用i,在环形圈内,就没有办法区分哪些i你喜欢使用。就第一个环节而言,一个错误仍然存在,因为i块被宣布为封装,第一个环节也被宣布为封装。

例如,后续行动将不编纂,即使是j也不可见,因此,在i方面不应有任何模棱两可之处:

1
2
3
4
5
6
7
8
9
{
    {
        int i = 1;
        int j = 1;
    }

    int i = 0; // compiler error: A local variable i cannot be declared in this scope (...)
    // j is not visible here
}

Edit regarding the comment:

为什么跟踪得很好?

ZZU1

当你宣布一个for时,只有在环形块内才可见。这意味着两个变量的范围被切断,因为没有一条代码线,在哪儿一块"超越"另一块。


一个圈的范围,EDOCX1&15

1
2
3
4
5
6
7
{
    INIT;
    while (COND) {
        BLOCK;
        INCR;
     }
 }

这是一个圆圈,可以是两个圆圈的最佳想法。(注:从forwhile的上次转换不会预见到continue的行为。)然而,这一问题并不是围绕着这个问题。

在C+中,如果你以同样的名称声明了一个范围变量,如外观中的某个东西,你"暗影"它,静默地掩盖它直到它结束。当他们发展到C 35;,他们觉得这太反直觉了,而且错误的代词。在C 35中,它是一个语法错误的阴影变量,从一个外观。通过引进int i到外面的范围,现在对for来说,这是非法的。


在环路中声明的变量只在环形块内,但当你声明环形块外的变量时,环形件内的变量就没有相同的名称,因为它混淆了你在环形体中所指的变量。

我会以你的代码为例

1
2
3
4
5
int i =0;
for (int i = 0; i < 10; i++)
{
  i = i+1; // now compiler is confused which i you mean here, so i complains on compile time that you have two with same name
}

因此,如果你已经声明了在你所做的loops之间,可变i的范围,那么两者都是可以获得的,那么,如果你重新开始第一个loop,它将仍然是投诉,因为变量的全球性范围在LOOP之外:

1
2
3
4
5
for (int i = 0; i < 10; i++)
{
  i = i+1; // now compiler is still confused which i you mean
}
int i =0;


我不认为你把int i;放在什么地方。

编译器第一次扫描现场,然后开始扫描表达式。由于i已被确认为一个领域,因此不需要汇编。


没有什么不对劲的。在第二个例子中,你确定了一个外在的i,然后试图在每一个环节中重新定义它。

在一个for中宣布的变量是局部的,但你已经在外视野中确定了另一个变量。

我想你已经问过另一个问题,假设一个变量起始点的范围是从宣言点?

一个变量范围是确定的区块,不受其位置的影响。当编译器在宣言之前拒绝使用变量时,它仍然在范围内。


您可以在环路之外声明当前的功能。Either Declare only Outer int i,and remove int ifrom both loops,or just remove this out variable.