Странное поведение проверки условия цикла - C#
Формулировка задачи:
Пишу алгоритм сортировки замещением. Дали задание написать алгоритм не только для возрастающего порядка, но и для убывающего.
Такое очевидное решение вполне работоспособно.
мне захотелось написать нечто более изящное
Но не тут то было: я всегда думал, что оператор && прерывает проверку, если первое условие ложно и не касается второго условия (ибо смысл?). Оказалось, что когда I==-1, он лезет в nondecreasing ? a[i] > key : a[i] < key, тем самым вызвая исключение System.IndexOutOfRangeException. Почему поведение оператора && такое непредсказуемое?
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;
}
скобки вокруг первого условия не помогли
Решение задачи: «Странное поведение проверки условия цикла»
textual
Листинг программы
while (i >= 0 && nondecreasing ? a[i] > key : a[i] < key) == while ((i >= 0 && nondecreasing) ? a[i] > key : a[i] < key)