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-ciif(((x+getLowX()) < getMinX) || ((x-getHighX())>getMaxX())))
- la plupart présumeront que l'arithmétique prime sur la logique et écrivent enif( ( x + getLowX() < getMinX ) || ( x - getHighX() > getMaxX() ))
supposant la priorité+
ci - dessus<
. Maintenant, intuitivement, ilif( 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é commeif( x ^ ( getMask() != PATTERN ) )
étant totalement contre-intuitif.Réponses:
Les langues l’ont copié à partir de C, et pour C, Dennis Ritchie explique qu’au départ, en B (et peut-être au début C), il n’y avait qu’une forme
&
qui, en fonction du contexte, était un peu logique ou non. Plus tard, chaque fonction a son opérateur:&
pour le bit à bit et&&
pour le logique. Puis il continuela source
c=2
ou avait poura==b
résultat~0
et non1
?Les opérateurs au niveau des bits sont liés aux opérateurs logiques à la fois conceptuellement et en apparence, ce qui explique probablement pourquoi ils sont proches les uns des autres dans le tableau des priorités. Peut-être pourrait-on même prétendre que ce serait déroutant
&
d’être plus élevé que d’==
avoir&&
été inférieur==
.Une fois établi un précédent (!), Il était probablement préférable que les autres langues le suivent pour des raisons de cohérence.
Cependant, j'ai tendance à être d'accord avec vous pour dire que ce n'est pas optimal. En utilisation réelle, les opérateurs de bits s'apparentent davantage à des opérateurs mathématiques que des opérateurs logiques, et il serait préférable qu'ils soient groupés avec les opérateurs mathématiques en priorité.
la source