Alguém poderia explicar a lógica, por que, em várias linguagens mais populares (veja a nota abaixo), os operadores de comparação (==,! =, <,>, <=,> =) Têm prioridade mais alta que os operadores bit a bit (&, |, ^ , ~)?
Acho que nunca encontrei um uso em que essa precedência fosse natural. Sempre são coisas como:
if( (x & MASK) == CORRECT ) ... // Chosen bits are in correct setting, rest unimportant
if( (x ^ x_prev) == SET ) // only, and exactly SET bit changed
if( (x & REQUIRED) < REQUIRED ) // Not all conditions satisfied
Os casos em que eu usaria:
flags = ( x == 6 | 2 ); // set bit 0 when x is 6, bit 1 always.
estão quase inexistentes.
Qual foi a motivação dos designers de linguagem para decidirem sobre essa precedência dos operadores?
Por exemplo, todos, exceto o SQL nos 12 principais idiomas, são semelhantes aos da lista de Popularidade da Linguagem de Programação em langpop.com: C, Java, C ++, PHP, JavaScript, Python, C #, Perl, SQL, Ruby, Shell, Visual Basic.
[arithmetics] [logic operator] [arithmetics]
. A maioria dos programadores não cria uma confusão de parênteses if(((x+getLowX()) < getMinX) || ((x-getHighX())>getMaxX())))
- a maioria assumirá precedência da aritmética sobre a lógica e escreverá if( ( x + getLowX() < getMinX ) || ( x - getHighX() > getMaxX() ))
assumindo precedência +
acima <
. Agora, intuitivamente, if( x ^ getMask() != PATTERN )
deve se comportar da mesma maneira, sendo o XOR o operador aritmético. O fato de ser interpretado como if( x ^ ( getMask() != PATTERN ) )
completamente contra-intuitivo.