Por que o operador postfix ++ tem precedência mais alta que o operador prefix +
Definido desta maneira, não podemos fazer nem++x++
nem++x--
. Mas por outro lado, ambos(++x)++
e(++x)--
são expressões úteis:(++x)++
incrementosx
por dois e retorna o valor "no meio", enquanto(++x)--
é essencialmente equivalente ax+1
, mas evita completamente ligar paraoperator+
, que às vezes pode ser bastante úti
Então, por que a precedência não está definida para ter++x++
expanda automaticamente para(++x)++
ao invés de++(x++)
? Existe algum significado oculto para o último que eu não entendo, ou é apenas para manter a precedência em uma lista simples, com todos os operadores de prefixo formando um único níve
EDITA Ok, eu não disse isso explicitamente, mas: é claro que eu quis dizerx
para ser do tipo definido pelo usuário. Para tipos internos,(x+=2)-1
é obviamente melhor que(++x)++
ex+1
é ummuit melhor que(++x)--
. A situação que tenho em mente é um iterador para um tipo bastante complicado de contêiner semi-associativo, em que operadores+=
e+
(sendo projetado para acesso aleatório) precisa reconstruir um cache para funcionar com eficiência em solicitações gerais e, portanto, é uma ordem de magnitude mais lenta que++
. Mas é claro que posso modificá-los para sempre verificar primeiro se o argumento é um número inteiro muito pequeno e, nesse caso, basta chamaroperator++
repetidamente em vez de executar o procedimento de acesso aleatório. Isso deve funcionar bem aqui, embora eu possa imaginar que, em algum momento, tenha uma situação na qual eu querooperator+=
para sempre seguir o caminho de acesso aleatório, independentemente de quão pequeno número eu a apresent
a vantagem de ter uma lista de precedências simples e memorizável na qualtodo operadores postfix vêm antesqualque dos operadores de prefixo é suficiente para tolerar a menor desvantagem de sempre ter que usar parênteses para compor operadores pré e pós-fixos++
/--
, como essa composição é usada muito raramente.
O "C faz assim" mais simples, embora pareça provável que seja orea motivo, é muito menos satisfatório para mim, porque desde++x++
não foi permitidoem absolut em C teria sido possível redefinir essa composição sem danificar nenhum código existent
De qualquer forma, vou continuar usando(++x)--
, como os parênteses realmente não doem tant