Такое простое выражение - это тип оператора, называемый «оператор выражения» в стандарте C. В соответствующем разделе стандарта (6.8.3) говорится:
Выражение в выражении
заявление считается недействительным
выражение для его побочных эффектов.
Чтение значения volatile
-качественной переменной считается таким побочным эффектом, поэтому его нельзя исключить, согласно §5.1.2.3:
Доступ к изменчивому объекту, изменение объекта, изменение файла или
вызывая функцию, которая выполняет любую из этих операций, все стороны
эффекты, которые являются изменениями в состоянии среды выполнения.
Предполагая, что SPI1BUF
является lvalue (это верно как для идентификатора, так и для макроса, который расширяется до вызова унарного оператора *
), в §6.3.2.1 есть следующее:
За исключением случаев, когда это операнд оператора sizeof
, унарный &
оператор, оператор ++
, оператор --
или левый операнд
оператор .
или оператор присваивания, значение которого не
иметь тип массива преобразуется в значение, хранящееся в назначенном
объект (и больше не является lvalue).
Поскольку ни одно из исключений не применимо, это гарантирует нам, что базовый (изменчивый) объект является «Доступным», поскольку lvalue было преобразовано в значение, хранящееся в объекте, что, очевидно, требует доступа к стоимость этого объекта.
В итоге: да, это стандартное поведение.