相同的代码,一个有效,一个无效。有什么不同?

Same code, one works one doesn't. What's different?

我是一名初级程序员,这是我第一次 posting。我目前正在用 C++ 编写蛇游戏。游戏的大部分内容并不难实现,但是当它到达蛇的尾巴时,整个程序就崩溃了。我花了大约 2 个小时试图找出问题所在,然后我决定尝试重写有问题的代码。 根据我的理解,我没有改变任何东西,但现在它起作用了。有人可以向我解释发生了什么变化吗? 这是代码,评论的一个不工作另一个工作正常:

   else { 
            bool eCoada = false;
            for (int s = 0; s <= ntail; s++)
            {
                if (tail[s].height == j && tail[s].width == k)
                { eCoada = true; break; }

            }
            if (eCoada == false)  cout << " ";
            else cout << "o";
        }
    /*  else  {
            bool eCoada = false;
        for (int s = 0;s <= ntail; s++)
        {
            if (tail[s].height==j &&  k==tail[s].width==k)
            { eCoada = true; break; }
            if (eCoada==false)  cout << " ";
            else cout << "o";
        }
               
            }*/

另外我应该提到这段代码是函数的一部分,如果你想让我post完整的代码我会这样做。

C++ 和我所知道的任何其他语言都不允许在一个语句中进行多重比较。 你不能说是 x == y == z, 你必须打破他们。 如果(x ==y && y == z)

k==tail[s].width==ktail[s].width == k 不同。你可能认为你写了类似 (k == tail[s].width) && (tails[s].width == k 的东西。但是 C++ 不会像那样自动放入 && 运算符。实际发生的是 == 运算符的 associativity 从左到右。所以这实际上意味着

(k == tails[s].width) == k

假设ktails[s].widthint,那就意味着(k == tails[s].width)bool。它与 k 之间的比较将检查 k0 还是 1,而不是检查它是否与预期的宽度匹配。


如果您的 if(eCoada==false) 行,另一个区别在于位置。

在您的工作代码中, for 循环完成后,这意味着它只执行一次。

在您损坏的代码中,它位于 循环 for 内,这意味着每次循环执行时都会打印 space。这也意味着因为你 break 在将 eCoada 设置为 true 后立即退出循环,你永远不会执行 else 分支并且永远不会打印 o