Ответ 1
Я не верю, что в этом отношении существует эффективная вариация между C и С++. Хотя формулировка последовательности меняется, конечный результат одинаков: оба приводят к поведению undefined (хотя C, похоже, указывает, что оценка будет успешной, но с результатом undefined).
В C99 (извините, у него нет C11), в пункте 5.1.2.3.5 указано:
- В точках последовательности летучие объекты стабильны в том смысле, что предыдущие обращения полный и последующий доступ еще не произошли.
В сочетании с вашей цитатой из 5.1.2.3.2 будет указано, что значение pa
не будет в стабильном состоянии, по крайней мере, для одного из обращений к pa
. Это имеет логичный смысл, поскольку компилятору разрешено оценивать их в любом порядке, только один раз или в одно и то же время (если это возможно). На самом деле это не определяет, что означает стабильное.
В С++ 11 имеется явная ссылка на неэфференциальные произведения в 1.9.13. Тогда в пункте 15 указывается, что такие операции с неоперабельностью в одном и том же операнде undefined. Поскольку поведение undefined может означать, что что-то происходит, возможно, оно сильное, чем C неустойчивое поведение. Однако в обоих случаях нет гарантированного результата вашего выражения.