2011-01-11 11 views
3

Ich schreibe einen kleinen Parser, der einen OR-Operator und einen AND-Operator haben wird. Wenn Sie eine Reihe von ORs und ANDs sehen, welche sind Ihrer Erwartung nach verbindlicher? Geben Sie den Ausdruck a & b | c, erwarten Sie, dass es (a&b)|c oder a&(b|c) bedeutet? Kannst du irgendeinen Grund angeben, eines vor dem anderen zu bevorzugen?Logisches ODER gegen logisches UND: Was sollte bindender sein?

+0

Ich benutze Klammern und/oder Abstand, um es explizit zu machen. –

Antwort

3

Machen Sie, was alle anderen tun; UND bindet fester als OR (siehe z. B. C Operator Precedence Table). Dies ist die Konvention, die alle erwarten, also adoptieren Sie die principle of least surprise.

Diese Wahl ist nicht willkürlich. Es beruht auf der Tatsache, dass AND und OR einer ähnlichen Beziehung folgen, um zu multiplizieren bzw. zu addieren; siehe z.B. http://en.wikipedia.org/wiki/Boolean_logic#Other_notations.

Beachten Sie auch, dass Benutzer Ihrer Sprache dringend dazu aufgefordert werden sollten, Klammern zu verwenden, um ihren Lesern ihren Code klar zu machen. Aber das liegt an ihnen!

0

Wenn Sie es wie Sie diskrete Mathematik betrachten würde, würde ich sagen PEMDAS führt Sie zu sagen, dass die UND ist verbindlicher. Das ist jedoch nicht immer der Fall.

Ich empfehle Ihnen, Ihren Benutzern zu empfehlen, überall dort Klammern zu verwenden, wo Unklarheiten bestehen.

0

Normalerweise hat & Vorrang vor | in vielen Szenarien. Sie können Ausdrücke jedoch auf eine vollständige Klammerform beschränken.

2

AND und OR in Boolesche Algebra sind äquivalent zu * und - in regelmäßigen Algebra, so macht es Sinn, das und bindet härter als oder gerade wie * härter bindet als +:

A B A*B A&B A+B A|B 
0 0 0 0 0  0 
0 1 0 0 1  1 
1 0 0 0 1  1 
1 1 1 1 1(>0) 1 
Verwandte Themen