The "elements" are C stmts thought of as mappings of memory configurations, and the binary operator is `;`. This is a monoid with identity element the empty C stmt.
Define,
modify(S) := the set of memory locations statement S *may* modify.
So now, `;` is commutative for every pair of statements S,T which *must not* (i.e. cannot under any possible dynamic execution path) modify one or more of the same memory locations.
(S ; T)===(T ; S) <==> modify(S)/\modify(T)==empty_set