我认为我理解编程的程度足以得到我想要的结果但是这对我来说根本不适用。我已将代码缩减为简单的控制台应用程序以获得帮助。目标是打印1x和0的5x5网格。实际上,我想创建一个随机的x和y值,如2和1,我称之为EmptyX和EmptyY。在这个地方,只有这个地方,我应该打印'0'。在所有其他细胞中应该是'1'。所以它应该是由EmptyX和EmptyY识别的所有1的期望网格。我的下面的代码尽管有效,但在整个列和行中都是零。
为什么会这样?我一直在看我的代码,似乎我的逻辑对我很好,但当然不是。如何才能在现场EmptyX和EmptyY中仅使用一个0来制作网格?
class Program
{
static void Main(string[] args)
{
int EmptyX = new Random().Next(5);
int EmptyY = new Random().Next(5);
for (int y = 0; y < 5; y++)
{
for (int x = 0; x < 5; x++)
{
if ((x != EmptyX) && (y != EmptyY))
Console.Write("1");
else
Console.Write("0");
}
Console.WriteLine();
}
Console.ReadKey();
}
}
与2和1示例相似:
11111
11011
11111
11111
11111
答案 0 :(得分:4)
问题是你在NOT的上下文中混淆了AND和OR。这是一个非常常见的逻辑错误(如this post所示)。
如果条件,不管你信不信,即使是经验丰富的开发人员也会陷入困境。我已经看到它发生了(从来没有故意)一遍又一遍地给那些没有注意的高级开发人员。所以,请放心,你并不孤单。
处理复杂if条件的最佳方法是编写Ridiculously Obvious Code (ROC),通过使用明显的命名并且可能对代码有点冗长,使逻辑点清晰可笑。在大多数情况下,抽出代码并不会影响性能,因为编译器会优化额外的工作变量并生成完全相同的IL。
例如,而不是写
if ((x != EmptyX) || (y != EmptyY)) //I fixed it for you
Console.Write("1");
else
Console.Write("0");
你可以写点像
bool isOnEmptyColumn = (x == EmptyX);
bool isOnEmptyRow = (y == EmptyY);
bool isOnEmptyCell = isOnEmptyColumn && isOnEmptyRow;
if (isOnEmptyCell)
{
Console.Write("0");
}
else
{
Console.Write("1");
}
以上内容需要多行代码,但是非常明显,并且使得逻辑运算符的组合变得更加困难。
如果您发现逻辑检查的详细程度使您的方法too long成为可能,则可以将逻辑提取到单独的函数中。在这个例子中,我还使用guard pattern来进一步简化逻辑:
private bool IsOnEmptyCell(int x, int y)
{
if (x != EmptyX) return false;
if (y != EmptyY) return false;
return true;
}
//Main program
if (IsOnEmptyCell(x,y))
{
Console.Write("0");
}
else
{
Console.Write("1");
}
再次,请放心,这不会影响性能,因为编译器会在必要时自动inline您的代码。重要的是要专注于编写易于理解且难以误解的源代码。
答案 1 :(得分:1)
只要
,您的代码就会打印0x=EmptyX or y=EmptyY
例如
if EmptyX =3 and EmptyY=3 and x=0 and y=3
if ((x != EmptyX) && (y != EmptyY))
if ((x != 3) && (y != 3))
if ((0 != 3) && (3 != 3))
if ((true) && (false))
if (false)
它不会打印&#39; 1&#39;什么时候应该 将你的病情改为
if ((x != EmptyX) || (y != EmptyY))
答案 2 :(得分:1)
修改你的if else条件。
方法-1。
if ((x == EmptyX) && (y == EmptyY))
Console.Write("0");
else
Console.Write("1");
方法-2。
if ((x != EmptyX) || (y != EmptyY))
System.out.print("1");
else
System.out.print("0");