2016-06-07 22 views
0

korrigierte ich kürzlich einen Fehler in einem C-Programm, wo ich hatte:Operator Vorrang in C (! = Und |)

if (foobar != FOO | BAR | BAZ) 

Der richtige Code

if (foobar != (FOO | BAR | BAZ)) 

Nach den C operator precedence ist es klar, dass != Vorrang vor | hat.

Meine Frage ist, warum es so ist und nicht umgekehrt? Aus meiner Erfahrung werde ich oft entweder a == b || a == c oder d == (a | b | c), aber nie a == b | c == d verwenden.

Was ist die Logik hinter dieser Wahl?

+0

'foobar! = FOO | BAR | BAZ ist äquivalent zu '(foobar!= FOO) | BAR | BAZ, weil der Präzedenzfall von '! =' Höher ist als '|'. Verwenden Sie es, wenn es das ist, was Sie wollen. – MikeCAT

+0

Weil man ein binärer arithmetischer Operator ('|') ist und somit zu der gleichen Ebene wie andere arithmetische Operatoren gehört, und der andere ist ein logischer Operator ('||'). – m0skit0

+0

Weil sich die Sprachdesigner dafür entschieden haben. –

Antwort

4

Es hat historische Gründe, Zitat von Dennis Ritchie:

„Early C hatte keine separaten Operatoren für & und & & oder | und ||. Stattdessen es verwendet den Begriff (geerbt von B und BCPL) von 'Wahrheitswert Kontext': wo ein boolescher Wert erwartet wurde, nach 'if' und 'während' und so weiter; die & und | Operatoren wurden interpretiert als & & und || sind jetzt; in gewöhnlichen Ausdrücken wurden die bitweisen Interpretationen verwendet. Es klappte gut, war aber schwer zu erklären. (Es gab die Vorstellung von 'Top-Level-Operatoren' in einem Wahrheitswert-Kontext.) "Die Priorität von & und | waren so wie sie jetzt sind.

In erster Linie auf Drängen von Alan Snyder, die & & und || Operatoren wurden hinzugefügt. Diese erfolgreich trennte die Konzepte von bitweisen Operationen und Kurzschluss Boolesche Auswertung. Allerdings hatte ich kalte Füße über den Vorrang Probleme. Zum Beispiel gab es viele Programme mit Dingen wie: if (a == b & c == d) ...

„Im Nachhinein wäre es besser gewesen, voran zu gehen und den Vorrang von & zu höheren ändern als ==, aber schien es sicherer nur & und & & ohne & vorbei an einem bestehenden Operator „

0

Dennis Ritchie zu bewegen zu spalten. Development of the C Language diese und andere merkwürdige historische Artefakte abdeckt.

Grundsätzlich ursprünglich die Sprache nicht über die && und || Betreiber - nur & und |, so dass Sie würde Schreib Dinge wie a == b | c == d. Die Präzedenzregeln wurden darauf basierend entworfen.

Später wurden die Kurzzündungsoperatoren hinzugefügt, aber der Vorrang der alten Operatoren wurde nicht revidiert.