2008-08-06 24 views
16

Was ist BODMAS und warum ist es nützlich in der Programmierung?Was bedeutet der Begriff "BODMAS"?

+0

[Operator Vorrang in C und C++] (http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence) – foxy

+0

Ich verwende normalerweise Leerraum, um die Reihenfolge der Operationen auf den vier anzeigen + -/* Operationen wie folgt: a + b * c Für alle anderen Operatoren verwende ich Klammern, um die Reihenfolge der Operationen zu verdeutlichen. –

+0

Ich habe BODMAS noch nie zuvor gesehen. Ich lernte PEMDAS (Parens, Exponenten, Multiplikation, Division, Addition, Subtraktion). – FishBasketGordo

Antwort

21

http://www.easymaths.com/What_on_earth_is_Bodmas.htm:

Was denken Sie, die Antwort auf 2 + 3 x 5?

Ist es (2 + 3) x 5 = 5 x 5 = 25?

oder 2 + (3 x 5) = 2 + 15 = 17?

BODMAS kann zur Rettung kommen und uns Regeln geben zu folgen, so dass wir immer die richtige Antwort:

(B) Schläger (O) rder (D) iVision (M) ultiplication (A) ddition (S) ubtraction

Nach BODMAS sollte die Multiplikation immer vor der Addition erfolgen, daher ist 17 die richtige Antwort nach BODMAS und wird auch die Antwort sein, die Ihr Rechner geben wird, wenn Sie 2 + 3 x 5 eingeben.

Warum ist es nützlich in der Programmierung? Keine Ahnung, aber ich nehme an, es ist, weil Sie einige Klammern loswerden können? Ich bin ein ziemlich defensive Programmierer, so meine Zeilen wie folgt aussehen:

result = (((i + 4) - (a + b)) * MAGIC_NUMBER) - ANOTHER_MAGIC_NUMBER; 

mit BODMAS können Sie diese ein wenig klarer machen:

result = (i + 4 - (a + b)) * MAGIC_NUMBER - ANOTHER_MAGIC_NUMBER; 

Ich glaube, ich immer noch die erste Variante verwenden würde - mehr Klammern, aber auf diese Weise muss ich nicht noch eine andere Regel lernen, und ich laufe in weniger Gefahr, es zu vergessen und jene sonderbaren schwer zu verursachen, Fehler zu debuggen?

Erraten nur an diesem Teil.

Mike Stone EDIT: Fest Mathe als Gaius weist darauf hin,

+1

Um ehrlich zu sein, ich bin mit Ihrem "Bracketty" -Stil, anstatt der angeblich optimierten Version. Vielleicht ist es nur ich, aber ich finde> result = (((+ 4) - (a + b)) * MAGIC_NUMBER) - ANOTHER_MAGIC_NUMBER; psychisch leichter zu analysieren ... – ZombieSheep

8

Eine andere Version dieses (in der Mittelschule) wurde "entschuldigen bitte meine liebe Tante Sally".

  • Klammerung
  • Exponents
  • Multiplikation
  • Abteilung
  • Addition
  • Subtraction

Die Gedächtnisstütze in der Schule war hilfreich, und immer noch nützlich heute in der Programmierung.

5

Reihenfolge der Vorgänge in einem Ausdruck, wie zum Beispiel:

foo * (bar + baz^2/foo) 
  • B Schläger ersten
  • O rders (dh Powers und Quadratwurzeln usw.)
  • D iVision und M ultiplication (von links nach rechts)
  • A ddition und S ubtraction (von links nach rechts)

Quelle: http://www.mathsisfun.com/operation-order-bodmas.html

4

Als ich das in der Grundschule (in Kanada) lernte, wurde es als BEDMAS bezeichnet:

B Schläger
E xponents
D iVision
M ultiplication
A ddition
S ubtraction

gerade für die von diesem Teil der Welt. ..

+0

Ebenso hier in Neuseeland. 'Exponenten' ergeben für mich mehr Sinn als die generisch genannte 'Bestellung' –

1

Ich bin nicht wirklich sicher, wie anwendbar für die Programmierung der alten BODMAS mnemonic ist sowieso. Es gibt keine Garantie für die Reihenfolge der Operationen zwischen den Sprachen, und während viele die Standardoperationen in dieser Reihenfolge beibehalten, tun dies nicht alle. Und dann gibt es einige Sprachen, in denen die Reihenfolge der Operationen nicht wirklich sinnvoll ist (zB Lisp-Dialekte). In gewisser Weise ist es wahrscheinlich besser für die Programmierung, wenn Sie die Standardreihenfolge vergessen und entweder Klammern für alles verwenden (zB (a * b) + c) oder spezifisch die Reihenfolge für jede Sprache erlernen, in der Sie arbeiten.

5

Ich habe nicht die Macht, @Michael Stum's answer zu bearbeiten, aber es ist nicht ganz richtig. Er reduziert

(i + 4) - (a + b) 

zu

(i + 4 - a + b) 

Sie nicht gleichwertig sind. Die beste Reduktion ich für den gesamten Ausdruck bekommen kann, ist

((i + 4) - (a + b)) * MAGIC_NUMBER - ANOTHER_MAGIC_NUMBER; 

oder

(i + 4 - a - b) * MAGIC_NUMBER - ANOTHER_MAGIC_NUMBER; 
0

ich irgendwo gelesen, dass vor allem in C/C++ Aufspalten Ihre Ausdrücke in kleine Aussagen zur Optimierung besser war; Anstatt also sehr komplexe Ausdrücke in einer Zeile zu schreiben, werden die Teile in Variablen zwischengespeichert und jede einzelne schrittweise ausgeführt und dann im weiteren Verlauf aufgebaut.

Die Optimierungsroutinen verwenden Register an Stellen, an denen Sie Variablen hatten, also sollte es keinen Einfluss auf den Raum haben, aber es kann dem Compiler ein wenig helfen.