相同的代码,一个有效,一个无效。有什么不同?
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==k
与 tail[s].width == k
不同。你可能认为你写了类似 (k == tail[s].width) && (tails[s].width == k
的东西。但是 C++ 不会像那样自动放入 &&
运算符。实际发生的是 ==
运算符的 associativity 从左到右。所以这实际上意味着
(k == tails[s].width) == k
假设k
和tails[s].width
是int
,那就意味着(k == tails[s].width)
是bool
。它与 k
之间的比较将检查 k
是 0
还是 1
,而不是检查它是否与预期的宽度匹配。
如果您的 if(eCoada==false)
行,另一个区别在于位置。
在您的工作代码中,在 for
循环完成后,这意味着它只执行一次。
在您损坏的代码中,它位于 循环 for
内,这意味着每次循环执行时都会打印 space。这也意味着因为你 break
在将 eCoada
设置为 true
后立即退出循环,你永远不会执行 else
分支并且永远不会打印 o
。
我是一名初级程序员,这是我第一次 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==k
与 tail[s].width == k
不同。你可能认为你写了类似 (k == tail[s].width) && (tails[s].width == k
的东西。但是 C++ 不会像那样自动放入 &&
运算符。实际发生的是 ==
运算符的 associativity 从左到右。所以这实际上意味着
(k == tails[s].width) == k
假设k
和tails[s].width
是int
,那就意味着(k == tails[s].width)
是bool
。它与 k
之间的比较将检查 k
是 0
还是 1
,而不是检查它是否与预期的宽度匹配。
如果您的 if(eCoada==false)
行,另一个区别在于位置。
在您的工作代码中,在 for
循环完成后,这意味着它只执行一次。
在您损坏的代码中,它位于 循环 for
内,这意味着每次循环执行时都会打印 space。这也意味着因为你 break
在将 eCoada
设置为 true
后立即退出循环,你永远不会执行 else
分支并且永远不会打印 o
。