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êntesesif(((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 comoif( x ^ ( getMask() != PATTERN ) )
completamente contra-intuitivo.Respostas:
Os idiomas copiaram isso de C, e para C, Dennis Ritchie explica que, inicialmente, em B (e talvez no início de C), havia apenas uma forma
&
que, dependendo do contexto, era um bit a bit e / ou lógica. Posteriormente, cada função obteve seu operador:&
para o bit a bit e&&
para o lógico. Então ele continuafonte
c=2
Oua==b
resultasse~0
e não1
?Operadores bit a bit estão relacionados a operadores lógicos conceitualmente e na aparência, o que provavelmente explica por que eles estão próximos um do outro na tabela de precedência. Talvez alguém possa até argumentar que seria confuso
&
ser maior do que==
, e ainda&&
assim menor==
.Depois que um precedente de precedência (!) Foi definido, provavelmente era melhor para outros idiomas segui-lo por uma questão de consistência.
No entanto, costumo concordar com você que isso não é o ideal. No uso real, os operadores de bits são mais parecidos com operadores matemáticos do que lógicos, e seria melhor se eles fossem agrupados com os operadores matemáticos em precedência.
fonte