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

And*_*uţă -3 c++ error-handling function object

我是一名初学者程序员,这是我第一次发帖。我目前正在用 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";
        }
               
            }*/
Run Code Online (Sandbox Code Playgroud)

另外我应该提到的是,这段代码是函数的一部分,如果您希望我发布完整的代码,我会这样做。

Nat*_*son 5

k==tail[s].width==k不等于tail[s].width == k. 您可能认为您已经写了类似的东西(k == tail[s].width) && (tails[s].width == k。但 C++ 不会自动添加&&这样的运算符。实际发生的情况是运算符的结合性==是从左到右的。所以这实际上意味着

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

假设ktails[s].widthints,这意味着(k == tails[s].width)是 a bool。和 之间的比较k将检查是否k01,而不是检查它是否与预期的宽度匹配。


另一个区别在于if(eCoada==false)线路的位置。

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

在损坏的代码中,它位于循环内部for,这意味着每次循环执行时都会打印一个空格。这也意味着,因为您在设置为 后break立即退出循环,所以您永远不会执行分支并且永远不会打印。eCoadatrueelseo