2015-04-30 2 views
4

я писал программу, которая принимает ввод с клавиатуры и печатает квадратную матрицу в следующей форме спиралиC# два заявления в то время как

1 2 3 
8 9 4 
7 6 5 

мне удалось написать программу, но я столкнулся с странными ошибками. в строке 26 он дает мне индекс из связанного исключения

while (matrix[row, col] == 0 && col < matrix.GetLength(0)) 

Однако если изменить порядок двух операторов внутри цикла исключение отступило? Означает ли это, что порядок двух операторов в цикле while важен? И если да, то почему? Не должно быть, если оба оператора верны для выполнения цикла, и если один из них является ложным, независимо от того, какой из них прекратит его выполнение.

Вот мой код:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace SpiralMatrixN 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      //prompt the user to enter n 
      Console.WriteLine("Enter the value of n"); 
      int n = int.Parse(Console.ReadLine()); 
      int[,] matrix = new int[n,n]; 
      Console.Clear(); 
      System.Console.SetWindowSize(100, 30); 
      int value = 1; 
      int col = 0; 
      int row = 0; 
      if (n>0 && n<21) 
      { 
       while(value <= n*n) 
       { 
        while (matrix[row, col] == 0 && col < matrix.GetLength(0)) 
        { 
         matrix[row, col++] = value; 
         value++; 
        } 
        col--; 
        row++; 
        while (row < matrix.GetLength(1) && matrix[row, col] == 0) 
        { 
         matrix[row++, col] = value; 
         value++; 
        } 

        row--; 
        col--; 
        while (col >= 0 && matrix[row, col] == 0) 
        { 
         matrix[row, col--] = value; 
         value++; 
        } 
        col++; 
        row--; 
        while (matrix[row, col] == 0 && row >= 0) 
        { 
         matrix[row--, col] = value; 

         value++; 
        } 

        col++; 
        row++; 
       } 

       for (int i = 0; i < matrix.GetLength(0); i++) 
       { 
        for (int j = 0; j < matrix.GetLength(1); j++) 
        { 
         Console.SetCursorPosition(j * 5, i * 2); 
         Console.Write(matrix[i, j] + " "); 
        } 
        Console.WriteLine(); 
       } 
      } 
     } 
    } 
} 
+0

Я хотел бы убедиться, что значения '' row' и col' то, что вы ожидаете, что они будут. Поместите точку останова и убедитесь, что цикл работает так, как вы этого хотите. –

+0

Вы должны разместить свой код здесь – demonplus

+1

Да, из-за короткого замыкания. Я уверен, что где-то есть хороший дубликат. – harold

ответ

15

Да, важен порядок. Условия в предложении & & выполняются в порядке очередности, а если один не выполняется, то другой не выполняется. В настоящее время у вас сбой, потому что выполняется matrix[row, col] == 0, а col выходит за пределы. Так что ваш чек на col (что абсолютно правильно кстати) должен прийти первым:

while (col < matrix.GetLength(0) && matrix[row, col] == 0) 

Если это не удается, второй оператор не будет выполнен, и вы не будете иметь ошибку. Это называется «оценка короткого замыкания».

5

Да, это называется оценкой короткого замыкания. Поскольку вы используете «& &», второе условие оценивается только после того, как первое оценивает значение true.

0

Операторы && и || известны как « ярлык операторов короткого замыкания»; вторая половина оценивается только при необходимости. Это полезно по двум причинам:

  1. Это более эффективно во время выполнения, так как меньше кода запуска (обычно не гораздо более, но если вы делаете IO или что-то это может быть), и
  2. Это удобно для программирования, так как вы можете использовать первую половину в качестве предпосылки ко второй половине, даже будучи оцененной. Такие, как,

    if (myObj != null && myObj.Name == "something")

    Если обе половинки были оценены выше, вы получите ошибку от myObj.Name когда myObj был нулевым.

Если вам нужны обе половины выражения не оцененной независимо от того, что вы можете использовать & или | операторов. Я нахожу, что я редко это делаю.

MSDN: && Operator (C# Reference)

+1

Короткое замыкание, а не ярлык, а только семантика. –

0

Порядок & & важно & & использует закорачивания против &, который не делает.В выражении & & слева направо, если условие ложно, другие условия не оцениваются.

Условные логические операторы

The & & и || операторы называются условными логическими операторами. Они также называются «короткозамкнутыми» логическими операторами.

условно-и-выражение:

включительно или выражение условно-и-выражение & & включено или выражение

условно-или-выражение:

условно-and выражение условное выражение или выражение || условно-и-выражение *

  • The & & и || операторы являются условными версиями & и | операторов:
  • операция х & & у соответствует операции х & у, исключением того, что у вычисляется только тогда, когда х верно.

Операция x || y соответствует операции x | y, за исключением того, что y оценивается только в том случае, если x является ложным.

Операция вида x & & y or x || y обрабатывается путем применения разрешения перегрузки (раздел 7.2.4), как если бы операция была записана x & y или x | у. Затем

  • Если разрешение перегрузки не удается найти ни одного оператора лучше , или если разрешение перегрузки выбирает одну из предопределенных целочисленных логических операторов, возникает ошибка времени компиляции.

  • В противном случае, если выбранный оператор является одним из предопределенных Логического логических операторов (раздел 7.10.2), операция обрабатывается как , описанные в разделе 7.11.1.

  • В противном случае выбранный оператор является определяемым пользователем оператором, а операция обрабатывается, как описано в разделе 7.11.2.

Невозможно напрямую перегрузить условные логические операторы. Однако, поскольку условные логические операторы оцениваются в условиях регулярных логических операторов, перегрузки регулярных логических операторов с определенными ограничениями также рассматривают перегрузки условных логических операторов . Это описано далее в разделе 7.11.2.

MSDN C# Conditional Operators От

Смежные вопросы