¿Podría alguien explicar la razón, por qué en un grupo de idiomas más populares (ver nota más abajo) los operadores de comparación (==,! =, <,>, <=,> =) Tienen mayor prioridad que los operadores bit a bit (&, |, ^ , ~)?
No creo que haya encontrado un uso donde esta precedencia sea natural. Siempre son cosas 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
Los casos en los que usaría:
flags = ( x == 6 | 2 ); // set bit 0 when x is 6, bit 1 always.
son casi inexistentes.
¿Cuál fue la motivación de los diseñadores de idiomas para decidir sobre la precedencia de los operadores?
Por ejemplo, todos menos SQL en los 12 idiomas principales son similares en la lista de popularidad del lenguaje de programación en langpop.com: C, Java, C ++, PHP, JavaScript, Python, C #, Perl, SQL, Ruby, Shell, Visual Basic.
[arithmetics] [logic operator] [arithmetics]
. La mayoría de los programadores no crean un lío de paréntesis como if(((x+getLowX()) < getMinX) || ((x-getHighX())>getMaxX())))
: la mayoría asumirá la precedencia de la aritmética sobre la lógica y escribirá if( ( x + getLowX() < getMinX ) || ( x - getHighX() > getMaxX() ))
asumiendo la precedencia de lo +
anterior <
. Ahora, intuitivamente, if( x ^ getMask() != PATTERN )
debería comportarse igual, siendo XOR un operador aritmético. El hecho de que se interpreta if( x ^ ( getMask() != PATTERN ) )
es completamente contra-intuitivo.