Не пойму, ты хочешь знать почему в C++ не так? Ok.
В некоторых языках, используются ленивые проверки условий (python, C++ наверно...).
Простейшие логические операции or и and не вычисляют второй+ операнд, если результат определяется предыдущими.
Есть условие (A and B and C), если выражение A=False, то нет смысла вычислять B и C, т.к. результат всего выражения всё равно уже False.
В этом случае в выражениях B и C могут быть уже и не вычисляемые значения при этом ошибки не будет.
В интерпретируемых языках там вообще может быть билиберда, лишь бы проверку синтаксиса прошла при запуске.
А в кликермэне нет ленивых вычислений и условий.
Поэтому в C++ проверка
(($k > 0) and ($arr[$k-1] > $arr[$k]))
вычислит только ($k > 0) и не будет обращаться к неправильным элементам массива.
Кликер сначала вычислит все операнды... точнее попытается, индекс то выходит уже неправильный.
Отсутствие ленивых вычислений не только в кликере, есть много других языков. Надо это учитывать и строить условия иначе.
Ленивые введены для скорости, а не для игнора ошибок как в задаче, это побочный эффект.
В примере выше в B и C могут быть вызовы функций со сложными ресурсоёмкими вычислениями. Которые сильно нагрузят процессор или выжрут память.