¿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 comoif(((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 interpretaif( x ^ ( getMask() != PATTERN ) )
es completamente contra-intuitivo.Respuestas:
Los lenguajes lo han copiado de C, y para C, Dennis Ritchie explica que inicialmente, en B (y tal vez al principio de C), solo había una forma
&
que, según el contexto, era una bit a bit o lógica. Más tarde, cada función obtuvo su operador:&
para el bit a bit y&&
para el lógico. Entonces él continúafuente
c=2
Oa==b
resultara~0
y no1
?Los operadores bit a bit están relacionados con operadores lógicos tanto conceptualmente como en apariencia, lo que probablemente explica por qué están cerca uno del otro en la tabla de precedencia. Quizás uno podría incluso argumentar que sería confuso
&
ser más alto que==
, pero aún así&&
ser más bajo==
.Una vez que se estableció un precedente de precedencia (!), Probablemente era mejor que otros idiomas lo siguieran por razones de coherencia.
Sin embargo, tiendo a estar de acuerdo con usted en que esto no es óptimo. En el uso real, los operadores de bits son más como operadores matemáticos que lógicos, y sería mejor si estuvieran agrupados con los operadores matemáticos con prioridad.
fuente