Почему «volatileQualifiedExpr + volatileQualifiedExpr» не обязательно UB в C, но в C ++?
Когда я сегодня читаю Стандарт C, он говорит о побочных эффектах
Доступ к энергозависимому объекту, изменение объекта, изменение файла или вызов функции, выполняющей любую из этих операций, являются побочными эффектами.
и стандарт C ++ говорит
Доступ к объекту, обозначенному как volatile glvalue (3.10), изменение объекта, вызов функции библиотечного ввода-вывода или вызов функции, выполняющей любую из этих операций, являются побочными эффектами.
Следовательно, поскольку оба запрещают возникновение непоследовательных побочных эффектов на одном и том же скалярном объекте, C допускает следующее, но C ++ делает его неопределенным поведением.
int a = 0;
volatile int *pa = &a;
int b = *pa + *pa;
Я правильно читаю спецификации? И в чем причина расхождения, если так?