Странное поведение проверки условия цикла - C#

Узнай цену своей работы

Формулировка задачи:

Пишу алгоритм сортировки замещением. Дали задание написать алгоритм не только для возрастающего порядка, но и для убывающего. Такое очевидное решение вполне работоспособно.
public static int[] Insertion(int[] a, bool nondecreasing = true)
        {
            if (nondecreasing)
            {
                for (int j = 1; j < a.Length; j++)
                {
                    int key = a[j];
                    int i = j - 1;
                    while (i >= 0 && a[i] > key)
                    {
                        a[i + 1] = a[i];
                        --i;
                    }
                    a[i + 1] = key;
                }
            }
            else
            {
                for (int j = 1; j < a.Length; j++)
                {
                    int key = a[j];
                    int i = j - 1;
                    while (i >= 0 && a[i] < key)
                    {
                        a[i + 1] = a[i];
                        --i;
                    }
                    a[i + 1] = key;
                }
            }
            return a;
        }
мне захотелось написать нечто более изящное
public static int[] Insertion(int[] a, bool nondecreasing = true)
        {
            for(int j = 1; j < a.Length; j++)
            {
                int key = a[j];
                int i = j - 1;
                while (i >= 0 && nondecreasing ? a[i] > key : a[i] < key)
                {
                    a[i + 1] = a[i];
                    --i;
                }
                a[i + 1] = key;
            }
            return a;
        }
Но не тут то было: я всегда думал, что оператор && прерывает проверку, если первое условие ложно и не касается второго условия (ибо смысл?). Оказалось, что когда I==-1, он лезет в nondecreasing ? a[i] > key : a[i] < key, тем самым вызвая исключение System.IndexOutOfRangeException. Почему поведение оператора && такое непредсказуемое?
скобки вокруг первого условия не помогли

Решение задачи: «Странное поведение проверки условия цикла»

textual
Листинг программы
while (i >= 0 && nondecreasing ? a[i] > key : a[i] < key) == while ((i >= 0 && nondecreasing) ? a[i] > key : a[i] < key)

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.2 из 5