Сначала вызовет неопределенное поведение как в C99, так и в C11.
В C99 это можно понять как; они вызовут неопределенное поведение из-за отсутствия точек последовательности.
C-faq:
Между предыдущей и следующей точкой последовательности сохраненное значение объекта должно быть изменено не более одного раза путем вычисления выражения. Кроме того, доступ к предыдущему значению должен осуществляться только для определения сохраняемого значения.
Объяснение:
Первый изменяет a
дважды между двумя точками последовательности, и, следовательно, поведение не определено в соответствии с оператором: Между предыдущей и следующей точкой последовательности объект должен иметь свое сохраненное значение. изменен не более одного раза при вычислении выражения. Вот и все (не нужно думать о b
).
Документация C11 гласит:
6.5 Выражения (п2):
Если побочный эффект на скалярном объекте не имеет последовательности относительно другого побочного эффекта на том же скалярном объекте или вычисления значения с использованием значения того же скалярного объекта, < strong>поведение не определено. Если существует несколько допустимых порядков подвыражений выражения, поведение не определено, если такой непоследовательный побочный эффект возникает в любом из порядков.84)
В (a) ^= (b) ^= (a) ^= (b)
побочный эффект на a
не имеет последовательности и, следовательно, вызывает неопределенное поведение. Следует отметить, что C11 6.5 p1 говорит, что:
[...] Вычисление значения операндов оператора выполняется до вычисления значения результата оператора.
Это гарантирует, что в
(a) ^= (b) ^= (a) ^= (b)
| | | |
1 2 3 4
все подвыражения 1, 2, 3 и 4 гарантированно будут вычислены до вычисления результата самого левого оператора ^=
. Но это не гарантирует, что побочный эффект выражения 3 гарантирован до вычисления значения результата самого левого оператора ^=
.
1. Акцент сделан на мне.
person
haccks
schedule
30.12.2013