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 しか見つかりませんでした。
前のシーケンス ポイントと次のシーケンス ポイントの間で、オブジェクトに格納されている値は、式の評価によって最大 1 回変更されます。[...]
この段落が上記のプログラムにどのような影響を与えるかは、私には明確ではありません。
多数のランダム化されたテストに基づいて、ほとんどのコンパイラは、2 つの割り当てが干渉しないコードを生成するようです。