C# != 操作员工作不正常
我目前正试图让我的蛇控制台游戏运行,但我已经想出了一些我不太明白。我真的不认为操作员工作不正常,所以我一定犯了一个错误,但我不知道为什么会这样:C# != 操作员工作不正常,c#,C#,我目前正试图让我的蛇控制台游戏运行,但我已经想出了一些我不太明白。我真的不认为操作员工作不正常,所以我一定犯了一个错误,但我不知道为什么会这样: // not working if (food.x != snakeElements.Last().x && food.y != snakeElements.Last().y) // working if (!(food.x == snakeElements.Last().x && food.y == sna
// 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))
不是都一样吗?使用!a&&!b是一样的!所以你的第一个例子应该是:
if (food.x != snakeElements.Last().x || food.y != snakeElements.Last().y)
使用!a&&!b是一样的!所以你的第一个例子应该是:
if (food.x != snakeElements.Last().x || food.y != snakeElements.Last().y)
我认为布尔逻辑在两种情况下是不同的: 两个比较必须不相等,if才能计算为true。 如果要计算为true,则其中任何一个都必须不相等
我认为布尔逻辑在两种情况下是不同的: 两个比较必须不相等,if才能计算为true。 如果要计算为true,则其中任何一个都必须不相等
&&应该在第一个if中为| |
if (food.x != snakeElements.Last().x || food.y != snakeElements.Last().y)
&&应该在第一个if中为| |
if (food.x != snakeElements.Last().x || food.y != snakeElements.Last().y)
不,不一样
如果这有效的话
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 | | |。否,它是不同的
如果这有效的话
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 | |的变化。如果您写出布尔条件的实际含义,您可以更清楚地看到区别
// not working
if (food.x != snakeElements.Last().x && food.y != snakeElements.Last().y)
这意味着:
食物与最后一个snake元素不在同一列中,并且食物与最后一个snake元素不在同一行中
逻辑错误现在更加明显了。如果食物的位置是10,3,最后一个元素的位置是14,3怎么办
与之相比:
// working
if (!(food.x == snakeElements.Last().x && food.y == snakeElements.Last().y))
这意味着:
食物与最后一个snake元素在同一行,食物与最后一个snake元素在同一列,这是不正确的
现在,当且仅当食物的X和Y与最后一个snake元素相同时,条件才为false。如果你写出布尔条件的实际含义,你就能更清楚地看到区别所在
// not working
if (food.x != snakeElements.Last().x && food.y != snakeElements.Last().y)
这意味着:
食物与最后一个snake元素不在同一列中,并且食物与最后一个snake元素不在同一行中
逻辑错误现在更加明显了。如果食物的位置是10,3,最后一个元素的位置是14,3怎么办
与之相比:
// working
if (!(food.x == snakeElements.Last().x && food.y == snakeElements.Last().y))
这意味着:
食物与最后一个snake元素在同一行,食物与最后一个snake元素在同一列,这是不正确的
现在,当且仅当食物的X和Y与最后一个蛇元素相同时,条件才为假。它们是不同的
为了清楚起见,我将把food.x称为x,把snakelements.Last.x称为x,其他称为Y和Y
第一种说法是:
如果X不同于X'且Y不同于Y',则为真
第二种说法是:
如果X等于X'且Y等于Y',则为false
假设X,X',Y,Y'是整数
如果我们说X=3,X'=5,Y=1,Y'=4,第一个语句是真的,因为X!=X'Y!=都是真的。然而,第二个也是正确的,因为X不等于X。它们是不同的
为了清楚起见,我将把food.x称为x,把snakelements.Last.x称为x,其他称为Y和Y
第一种说法是:
如果X不同于X'且Y不同于Y',则为真
第二种说法是:
如果X等于X'且Y等于Y',则为false
假设X,X',Y,Y'是整数
如果我们说X=3,X'=5,Y=1,Y'=4,第一个语句是真的,因为X!=X'Y!=都是真的。然而,第二个也是正确的,因为X不等于X。您不是在比较浮动吗?另外,请注意,这两种情况是不同的,而这两种情况并不相同!看,你不能这样移动否定。x或y是自定义对象吗?不,结构包含两个整数x和y,不是都一样吗不,你不是在比较浮动吗?另外,请注意,这两种情况是不同的,而这两种情况并不相同!看,你不能这样移动否定。x或y是自定义对象吗?不,结构包含两个整数x和y,不是都一样吗不。@Blorgbeard:虽然这是事实,但这仍然是正确的道路。链接和演示非常有用。更不用说我们不知道哪一个是真正的目标,因为OP认为它们是等效的。@Blorgbeard-是的,你是对的,谢谢。我已经更新了答案。@Magus我们知道,因为他说//not working and//working@Blorgbeard当前位置你是对的,但我仍然认为值得他仔细测试他的逻辑,因为这两种逻辑非常不同。当这样一个重要的逻辑问题出现时,确保你的先入之见没有错是很重要的。@Blorgbeard:虽然这是事实,但这仍然是正确的道路。链接和演示非常有用。更不用说我们不知道哪个才是真正的目标,因为
OP认为他们是对等的。@Blorgbeard-是的,你是对的,谢谢。我已经更新了答案。@Magus我们知道,因为他说//not working and//working@Blorgbeard当前位置你是对的,但我仍然认为值得他仔细测试他的逻辑,因为这两种逻辑非常不同。当这样一个重要的逻辑问题出现时,确保你的先入之见没有错是很重要的。