Для реализации, которая упаковывает f0
и f1
в один и тот же байт, это программа ниже
struct S0 {
unsigned f0:4;
signed f1:4;
} l_62;
int main (void) {
(l_62.f0 = 0) + (l_62.f1 = 0);
return 0;
}
Меня интересует ответ для C99 и C11, если есть основания полагать, что там он другой.
В C99 я нашел только 6.5: 2:
Между предыдущим и следующим точка последовательности объект должен иметь свою сохраненное значение, измененное не более одного раза при вычислении выражения. [...]
Мне непонятно, какие последствия этот абзац имеет для указанной выше программы.
Основываясь на большом количестве рандомизированных тестов, большинство компиляторов, похоже, генерируют код, в котором два присваивания не мешают.