我目前正试图让我的蛇控制台游戏运行,但我想出了一些我不太了解的东西。我真的不认为!=
运算符工作不正常,所以我一定犯了一个错误,但我不知道为什么会这样:
// not working
if (food.x != snakeElements.Last().x && food.y != snakeElements.Last().y)
// working
if (!(food.x == snakeElements.Last().x && food.y == snakeElements.Last().y))
不一样吗?
答案 0 :(得分:21)
使用De Morgan's laws (!a && !b)
与!(a || b)
相同,因此您的第一个示例应为:
if (food.x != snakeElements.Last().x || food.y != snakeElements.Last().y)
答案 1 :(得分:5)
&&应该是||在第一个if。
if (food.x != snakeElements.Last().x || food.y != snakeElements.Last().y)
答案 2 :(得分:2)
如果你用布尔条件写出你的实际意思,你可以更清楚地看到差异是什么。
// not working
if (food.x != snakeElements.Last().x && food.y != snakeElements.Last().y)
这意味着:
“食物与最后一个蛇元素不在同一列,食物与最后一个蛇元素不在同一行”
现在逻辑错误更加明显。如果食物的位置是(10,3),最后一个元素的位置是(14,3)怎么办?
与:比较:
// working
if (!(food.x == snakeElements.Last().x && food.y == snakeElements.Last().y))
这意味着:
“食物与最后一个蛇元素位于同一行并且食物与最后一个蛇元素在同一列中”并非如此。“
现在条件为假,当且仅当食物具有与最后一个蛇元素相同的X 和 Y时。
答案 3 :(得分:1)
不,它不一样。
如果这样有效......
if (!(food.x == snakeElements.Last().x && food.y == snakeElements.Last().y)) // working
那么这也应该有用......
if (food.x != snakeElements.Last().x || food.y != snakeElements.Last().y) // should work
注意符号从逻辑AND(&&)到逻辑OR(||)的变化。
答案 4 :(得分:0)
我认为布尔逻辑在两种情况下是不同的:
答案 5 :(得分:0)
他们是不同的。
为了清楚起见,我将food.x
称为X
,snakeElements.Last().x
称为X'
,其他人称为Y
和Y'
。< / p>
首先是说:
如果
X
与X'
不同且Y
与Y' is true
不同
第二个人说:
如果
X
等于X'
且Y
等于Y' is false
假设X
,X'
,Y
,Y'
是整数
如果我们说X = 3, X' = 5, Y = 1, Y' = 4
,则第一个陈述为真,因为X != X'
Y != Y'
都是真的。但是,第二个也是正确的,因为X
不等于X'
。