!=运算符不能正常工作

时间:2014-03-10 21:38:08

标签: c#

我目前正试图让我的蛇控制台游戏运行,但我想出了一些我不太了解的东西。我真的不认为!=运算符工作不正常,所以我一定犯了一个错误,但我不知道为什么会这样:

 // 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)) 

不一样吗?

6 个答案:

答案 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)

我认为布尔逻辑在两种情况下是不同的:

  1. 对于if评估为true,两个比较必须不相等。
  2. 任何一个必须不相等才能评估为真

答案 5 :(得分:0)

他们是不同的。

为了清楚起见,我将food.x称为XsnakeElements.Last().x称为X',其他人称为YY'。< / p>

首先是说:

  

如果XX'不同 YY' is true不同

第二个人说:

  

如果X等于X' Y等于Y' is false

假设XX'YY'是整数

如果我们说X = 3, X' = 5, Y = 1, Y' = 4,则第一个陈述为真,因为X != X' Y != Y'都是真的。但是,第二个也是正确的,因为X不等于X'