Pontos de sequência e efeitos colaterais: Mudança silenciosa no C11?

C99 §6.5Expressões

(1) Uma expressão é uma sequência de operadores e operandos que especifica a computação de um valor, ou que designa um objeto ou uma função, ou que gera efeitos colaterais, ou que executa uma combinação dos mesmos.

(2) Entre o ponto de sequência anterior e o próximo, um objeto deve ter seu valor armazenado modificado no máximo uma vez pela avaliação de uma expressão.72) Além disso, o valor anterior deve ser lido apenas para determinar o valor a ser armazenado.73)

com as notas de rodapé

72) Um sinalizador de status de ponto flutuante não é um objeto e pode ser definido mais de uma vez em uma expressão.

73) Este parágrafo renderiza expressões de declaração indefinidas, como

    i = ++i + 1;
    a[i++] = i;

enquanto permite

    i = i + 1;
    a[i] = i;

onde C11 §6.5 foi alterado para (o texto de (1) possui um adendo):

(1) […] Os cálculos dos valores dos operandos de um operador são sequenciados antes do cálculo dos valores do resultado do operador.

(2) Se um efeito colateral em um objeto escalar não for relacionado em relação a um efeito colateral diferente no mesmo objeto escalar ou a uma computação de valor usando o valor do mesmo objeto escalar, o comportamento será indefinido. Se houver várias ordens permitidas das subexpressões de uma expressão, o comportamento será indefinido se ocorrer um efeito colateral não conseqüente em qualquer uma das ordens.84)

onde a nota de rodapé 84 em C11 é igual a 73 em C99.

Estou um pouco confuso… li C11 (2) como "[...] (um efeito colateral diferente no mesmo objeto escalar) ou (uma computação de valor usando o valor do mesmo objeto escalar) [...]" que parece nem mesmo permitirfoo = ++i (existe um efeito colateral e usamos um valor dependendo do objeto alterado). No entanto, eu não sou um falante nativo, então seria bom se alguém pudesse me dizer como essa frase deve ser "analisada". Eu entendo C99, mas não entendo muito bem o texto de C11.

Enfim, a pergunta real: essa é uma alteração de C99 para C11 ou esses termos são equivalentes? E se sim, por que foi alterado? E se não, alguém poderia dar um exemplo de expressão que é UB em C99, mas não em C11 ou vice-versa?

questionAnswers(4)

yourAnswerToTheQuestion