Является ли `x--> 0 && array [x]` корректным поведением в С++?

Могу ли я использовать x с обеих сторон булевского выражения, когда я добавляю его с левой стороны?

Соответствующая строка:

 if(x-- > 0 && array[x]) { /* … use x … */ }

Является ли это определенным стандартом? Будет ли массив [x] использовать новое значение x или старое?

Ответ 1

Это зависит.

Если && является обычным короткозамкнутым логическим оператором, то это прекрасно, потому что есть точка последовательности. array[x] будет использовать новое значение.

Если && является пользователем (или библиотекой), определенным перегруженным оператором, то отсутствует короткое замыкание, а также нет гарантии точки последовательности между оценкой x-- и оценкой array[x]. Это выглядит маловероятным с учетом вашего кода, но без контекста нельзя сказать точно. Я думаю, что с осторожным определением array можно организовать его таким образом.

Вот почему почти всегда сложно перегрузить operator&&.

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

Ответ 2

Да, это четко определено. && вводит точку последовательности.