Essas expressões estão definidas?
int x = 5, y;
y = ++(int){++x};
//or
y = (int){x++}++;
e (não consigo encontrar nenhuma razão para não ser definido)
int x = 5;
x = ++(int){++x};
//or
x = (int){x++}++;
Na IMO, existem pontos de sequência claros onde o novo objeto (literal composto) é criado.
Estes estão bem:
Como nenhum objeto está sendo lido ou escrito mais de uma vez, especificamente
x
,y
e os literais compostos sem nome. Modificar o literal composto também não é um problema porque (neste caso) ele tem duração de armazenamento automático e, portanto, seu tempo de vida é o do bloco envolvente, mesmo que fique inacessível devido ao seu endereço não ter sido usado.Em contraste, estes desencadeiam um comportamento indefinido:
Porque
x
é modificado mais de uma vez sem um ponto de sequência, já que o uso de um literal composto não introduz um ponto de sequência.A seção 6.8p4 do padrão C afirma o seguinte (não a parte em negrito):
No exemplo acima, porque
++x
faz parte do inicializador de um literal composto, não se qualifica como uma expressão completa e, portanto, não há ponto de sequência introduzido pelo literal composto.