Quelqu'un pourrait-il expliquer pourquoi, dans la plupart des langages courants (voir la remarque ci-dessous), les opérateurs de comparaison (==,! =, <,>, <=,> =) Ont une priorité plus élevée que les opérateurs binaires (&, |, ^ , ~)?
Je ne pense pas avoir jamais rencontré un usage où cette préséance serait naturelle. C'est toujours du genre:
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
Les cas où j'utiliserais:
flags = ( x == 6 | 2 ); // set bit 0 when x is 6, bit 1 always.
sont presque inexistants.
Quelle était la motivation des concepteurs de langage pour décider de cette préséance des opérateurs?
Par exemple, tous les langages sauf le SQL dans les 12 langues les plus utilisées ressemblent à ceux de la liste de popularité du langage de programmation sur langpop.com: C, Java, C ++, PHP, JavaScript, Python, C #, Perl, SQL, Ruby, Shell, Visual Basic.
[arithmetics] [logic operator] [arithmetics]
. La plupart des programmeurs ne créent pas un fouillis de parenthèses comme celui-ci if(((x+getLowX()) < getMinX) || ((x-getHighX())>getMaxX())))
- la plupart présumeront que l'arithmétique prime sur la logique et écrivent en if( ( x + getLowX() < getMinX ) || ( x - getHighX() > getMaxX() ))
supposant la priorité +
ci - dessus <
. Maintenant, intuitivement, il if( x ^ getMask() != PATTERN )
devrait se comporter de la même manière, XOR étant un opérateur arithmétique. Le fait que cela soit interprété comme if( x ^ ( getMask() != PATTERN ) )
étant totalement contre-intuitif.