Рассмотрим следующий код:
int main(){
int i = 0;
int a = ++i + ++i;
}
Я не могу найти информацию, которая говорит о том, что операнды +
не секвенированы. Таким образом, в соответствии со стандартом, последовательность операндов двоичного кода +
является неопределенно упорядоченной.
[intro, excution] / 15
Учитывая любые два оценки A и B, если A чередуется перед B (или, что то же самое, B чередуется после A), то выполнение A должно предшествовать выполнению B. Если A не чередуется до B, а B не чередуется до A, тогда A и B не секвенированы. [Примечание: выполнение непоследовательных оценок может частично совпадать. - примечание к концу]
Оценки A и B имеют неопределенную последовательность , когда последовательность A последовательно перед B или B последовательно перед A, но не определена, какая. [Примечание: неопределенные последовательности не могут перекрываются, но любой из них может быть выполнен первым. - примечание к концу]
Цитата означает, что оценка A может произойти до B, или оценка B может произойти до A. И выполнение непоследовательных оценок может перекрываться , тогда как неопределенно упорядоченные вычисления не могут перекрываться , которые отличаются.
Мы знаем, что модификация i
всегда происходит до вычисления значения i
из-за префикса ++
.
Затем в соответствии с правилами:
Оценка выражения (или подвыражения) в целом включает оба вычисления значения (включая определение идентификатора объекта для оценки glvalue) и извлечение значения, ранее назначенного объекту для оценки значения) и инициирование побочных эффектов
Если побочный эффект в ячейке памяти не секвенирован относительно любого другого побочного эффекта в той же памяти местоположение или вычисление значения с использованием значения любого объекта в той же ячейке памяти, и т они не являются потенциально одновременными, поведение не определено
Так что независимо от того, является ли оценка A до B или наоборот, не существует побочных эффектов, связанных с вычислением соответствующего значения или побочный эффект для ++i + ++i;
. Поскольку неопределенно упорядоченные оценки не могут перекрываться, одна из двух оценок должна быть полностью выполнена перед другой. Оценка включает в себя как расчет стоимости, так и побочный эффект. Следовательно, одно приращение до i
оценивается раньше другого.
Однако непоследовательные вычисления следуют другим правилам, поэтому путаница будет устранена, если вычисления операндов двоичного файла +
не не секвенированы. а не неопределенно упорядоченный. Если я что-то пропустил в стандарте в анализе выше, поправьте меня.
Обновление
Я нашел следующее предложение, которое, по-видимому, предполагает, что оценки не являются последовательными:
За исключением случаев, где указано, оценки операндов отдельных операторов и подвыражения отдельных выражений не секвенированы .
Однако я не знаю, как правильно понять предложение. Я придумал две интерпретации:
Для оператора A вычисления операндов A не последовательны друг с другом; для выражения B вычисления подвыражений B не связаны друг с другом.
и
Принимать оценки операндов отдельных операторов как A. Принимать оценки подвыражения отдельных выражений в виде B. A не секвенируется с B.
Какая интерпретация верна?