C# for循环迭代器突然改变

C# for循环迭代器突然改变,c#,unity3d,C#,Unity3d,这是我的方法,它只是一个嵌套循环: IEnumerator startNewRound() { string st = "آبپتثجچحخدذرضطظعغفقکگلمنوهی"; for (int i = 0; i < st.Length; i++) { for (int j = i + 1; i < st.Length; j++) { for (int z = j + 1; z < st.Len

这是我的方法,它只是一个嵌套循环:

IEnumerator startNewRound()
{
    string st = "آبپتثجچحخدذرضطظعغفقکگلمنوهی";
    for (int i = 0; i < st.Length; i++)
    {
        for (int j = i + 1; i < st.Length; j++)
        {
            for (int z = j + 1; z < st.Length; z++)
            {
                if (z > st.Length) continue;
                yield return new WaitForSeconds(0.1f);
                Debug.Log("I = " + i + " J = " + j + " Z= " + z);
            }
        }
    }
}
突然,循环程序内部冻结了几秒钟,“j”计数器发生变化,所有东西都爆炸了! 这是我的日志:


我不明白怎么了

在第二个嵌套循环中,您错误地使用i而不是j作为循环控制变量:

for (int j = i + 1; i < st.Length; j++)
应该是

for (int j = i + 1; j < st.Length; j++)
为什么这会引起问题?让我们看看输出的相关部分:

I=0 J=24 Z=25 I=0 J=24 Z=26 I=0 J=25 Z=26 I=0 J=2147483647 Z=-2147483648 I=0 J=2147483647 Z=-2147483647 I=0 J=2147483647 Z=-2147483646

当代码达到I=0、J=25和z=26时,即比st的长度小一,发生以下情况:

z增加到27 第三个循环中的测试检查z我无法将您的日志视为映像。在第二个循环内,但在第三个循环外,以文本形式发布调试日志可能有助于您调试问题。或者实际上只是使用调试器并单步执行。你很快就会看到j得到了一个不应该被允许的值,然后可能会注意到JamieC在回答中描述的问题。调试是你的朋友。虽然这是真的,但j不会仍然被初始化为i+1,并且永远不会是负值。换句话说,你的答案是正确的,但它回答了问题吗?负值很可能是由于int的溢出。@LasseVågsætherKarlsen你可能是对的,我不知道-我们看不出还有什么其他的情况。但我敢打赌这和循环控制变量有关@杰米克:你完全可以看到主要的问题。基本上,如果j>st.length,第三个循环就不会做任何事情,因为z也会。因此,第二个循环不断增加j,直到最后达到最大值,然后z将溢出,最后第三个循环将执行某些操作。我唯一搞不懂的是为什么j是-2147483648而不是2147483647。我怀疑这可能是因为给出的代码与显示的输出不完全匹配。@Chris yup。更新答案。这不容易描述。我想你可能比我做得更好