Ответ 1
Это зависит.
Если &&
является обычным короткозамкнутым логическим оператором, то это прекрасно, потому что есть точка последовательности. array[x]
будет использовать новое значение.
Если &&
является пользователем (или библиотекой), определенным перегруженным оператором, то отсутствует короткое замыкание, а также нет гарантии точки последовательности между оценкой x--
и оценкой array[x]
. Это выглядит маловероятным с учетом вашего кода, но без контекста нельзя сказать точно. Я думаю, что с осторожным определением array
можно организовать его таким образом.
Вот почему почти всегда сложно перегрузить operator&&
.
Кстати, if ((x > 0) && array[--x])
имеет очень схожий эффект (опять же, не предполагая, что оператор перегружает shenanigans), и, на мой взгляд, яснее. Разница заключается в том, уменьшается или нет x
уменьшается на 0, на что вы можете или не можете полагаться.