Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

Grüß Euch!

Welches Ergebnis liefert eigentlich eine Rechenmaschine bei sagen wir mal folgendem Code:

int a,b,c,d;


a=3;

b=2;

c=1;

d=a-b+c;

printf("d = %d",d);

Ich hab es einfach mal im C-Code hingeschrieben, es ist aber auch formatierbar für andere Sprachen oder sehen wir es einfach als Pseudocode, aber interessanter ist das Ergebnis und vieleicht eine Begründung dafür.

Bei uns ist eine heiße Diskussion entbrannt welches Ergebnis richtig ist und welches nicht oder vieleicht gibt es auch mehrere mögliche Lösungen.

Danke für jedes sachdienliche Posting!

:P GREETZ :P

********

* Fiesek *

********

Geschrieben

Ich rate einfach mal: 3-2+1 sollte also theoretisch 2 ergeben. Laß ich den Code laufen ... ist d=2 und die Ausgabe ist auch 2! Was sollte da falsch oder anders sein? Das einzigste was sein könnte ist, daß ein Compiler die Operatoren in undefinierter Reihenfolge übersetzt (was auch tatsächlich in C & C++ Sache des Compilerbauers ist), sich allerdings in diesem Fall nicht sonderlich auswirken sollte.

Mich würden mal Eure davon abweichenden Diskussionsvorschläge interessieren.

Geschrieben

Morgen!!

Nachdem meiner Meinung nach der '=' - Operator als letztes ausgewertet wird (festlegung) und die anderen beiden Berechnungen vertauschbar sind (das Fremdwort habe ich am Tag meiner Abifeier vergessen), sollte das Ergebnis eindeutig sein: 2

Es könnte sein, dass durch eine Rundung bei Fliesskommatypen etwas anderes rauskommt, aber bei Ganzzahlwerten müsste es eindeutig sein.

Der Compiler dürfte keine Rolle spielen.

Jedoch lasse ich mich gerne eines besseren belehren.

k.o.b

Geschrieben

Ich kann mir nicht vorstellen, dass es Programmiersprachen gibt, die in ihrer Spezifikation etwas so wichtiges wie die Auswertungsreihenfolge einer Verkettung von Operatoren mit gleicher Priorität nicht behandeln.

Wenn ich mich richtig erinnere, ist es zumindest bei C++ so, dass festgelegt ist, dass zweiseitige Operatoren (mit Ausnahme der Zuweisungen) linksbindend sind, also:

a = b = c entspricht a = (b = c)

und

a + b + c entspricht (a + B) + c

Das ist IMHO die Lösung, die der Intuition des Lesers am nächsten kommt. Ich glaube nicht, dass irgendeine Sprache das anders löst.

Geschrieben

Nun gut, mir ist da aber die UPN untergekommen, UPN = umgekehrte polnische Notation.

Kein Witz, ich mein es Ernst mit UPN.

Ich hätte gehofft, dass mir hier jemand nochmal ganz genau erklären kann, wie die Maschinen eigentlich rechnen und warum nun wirklich d=2 ist und nicht 0.

Wir hatten im Unterricht eine Operatoren-Prioritäten-Tabelle, in der eindeutig stand, dass in dem Fall + eine höhere Priorität hat als -, komischerweise rechnet mein PC in C++, C, Java und Java-Script anders oder hab ich da was missverstanden?

Nach UPN sieht die Aufgabe so aus:

d=a-(b+c);

Das Ergebnis wäre dann Null.

Die Klammern würden vom PC automatisch gesetzt, weil ja + eine höhere Priorität hat.

Allerdings ist diese Tabelle aus einem Buch, welches Anfang der 80er verfasst wurde, vieleicht gabs eine Änderung in der Informatik.

:P GREETZ :P

********

* Fiesek *

********

Geschrieben
Original geschrieben von kingofbrain

Das wäre aber ein grober Missgriff gegen die grundlegenden Regeln der Mathematik, in der gilt, dass ich Strichrechnungen untereinander austauschen kann (Fachwort hab ich immer noch vergessen).

Das ist so nicht ganz richtig. Die Addition ist zwar assoziativ und kommutativ, die Subtraktion aber nicht. In der Mathematik werden solche Ausdrücke einfach von links nach rechts abgearbeitet, daher nehme ich an, dass das bei allen Programmiersprachen genauso ist.

@Fiesek:

Plus vor Minus? :eek:

Für welche Programmiersprache soll denn diese Tabelle gewesen sein?

Geschrieben
Originally posted by kingofbrain

Morgen!!

Nachdem meiner Meinung nach der '=' - Operator als letztes ausgewertet wird (festlegung) und die anderen beiden Berechnungen vertauschbar sind (das Fremdwort habe ich am Tag meiner Abifeier vergessen), sollte das Ergebnis eindeutig sein: 2

Es könnte sein, dass durch eine Rundung bei Fliesskommatypen etwas anderes rauskommt, aber bei Ganzzahlwerten müsste es eindeutig sein.

Der Compiler dürfte keine Rolle spielen.

Jedoch lasse ich mich gerne eines besseren belehren.

k.o.b

Ist das Fremdwort das du meinst "kommutativ" ? Das gilt ja auch bei der Multiplikation.

Ich weiss allerdings momentan nicht was das Geheimnis von d = a-b +c ist.

Frank

Geschrieben
Originally posted by Fiesek

Nun gut, mir ist da aber die UPN untergekommen, UPN = umgekehrte polnische Notation.

Kein Witz, ich mein es Ernst mit UPN.

Ich hätte gehofft, dass mir hier jemand nochmal ganz genau erklären kann, wie die Maschinen eigentlich rechnen und warum nun wirklich d=2 ist und nicht 0.

Wir hatten im Unterricht eine Operatoren-Prioritäten-Tabelle, in der eindeutig stand, dass in dem Fall + eine höhere Priorität hat als -, komischerweise rechnet mein PC in C++, C, Java und Java-Script anders oder hab ich da was missverstanden?

Nach UPN sieht die Aufgabe so aus:

d=a-(b+c);

Das Ergebnis wäre dann Null.

Die Klammern würden vom PC automatisch gesetzt, weil ja + eine höhere Priorität hat.

Allerdings ist diese Tabelle aus einem Buch, welches Anfang der 80er verfasst wurde, vieleicht gabs eine Änderung in der Informatik.

:P GREETZ :P

********

* Fiesek *

********

Ich weiss zwar nicht auf welche Sprache sich dein Unterricht bezogen hat aber UPN bedeutet das man erst die Opranden und dann den Operator eingibt. Damit kann man dann schön stack-basierte Operationen ausführen.

Beispiel:

b c + -> Ergebnis kommt dann auch auf den Stack

a - -> ist dann das Ergebnis und kommt auch auf den Stack

Und das ist auch keine UPN was du da geschrieben hast sondern ganz normale (unpolnische Notation).

Frank

Geschrieben
Originally posted by Fiesek

Nun gut, mir ist da aber die UPN untergekommen, UPN = umgekehrte polnische Notation.

Kein Witz, ich mein es Ernst mit UPN.

Ich hätte gehofft, dass mir hier jemand nochmal ganz genau erklären kann, wie die Maschinen eigentlich rechnen und warum nun wirklich d=2 ist und nicht 0.

Wir hatten im Unterricht eine Operatoren-Prioritäten-Tabelle, in der eindeutig stand, dass in dem Fall + eine höhere Priorität hat als -, komischerweise rechnet mein PC in C++, C, Java und Java-Script anders oder hab ich da was missverstanden?

Nach UPN sieht die Aufgabe so aus:

d=a-(b+c);

Das Ergebnis wäre dann Null.

Die Klammern würden vom PC automatisch gesetzt, weil ja + eine höhere Priorität hat.

Allerdings ist diese Tabelle aus einem Buch, welches Anfang der 80er verfasst wurde, vieleicht gabs eine Änderung in der Informatik.

:P GREETZ :P

********

* Fiesek *

********

Ich würde dir empfehlen einfach mal zurück in die 7 Klasse Hauptschule oder so oder lernt man das heute dort nicht mehr:

a-b+c <> a - ( b +c ) wenn man die Klammer auflöst dann kommt für a - ( b+c) nämlich

a - b - c heraus was dann 0 ergibt wenn man für a = 3 , b =2 und c =1 annimmt da:

0 = 3 -2 -1 <> 3-2+1 oder

3 - ( 2+1) = 0

Die Klammer ändert die Reihenfolge der Abarbeitung, das ist Mathematik aus der 7. Klasse.

Das kann ja nicht wahr sein.

Frank

Geschrieben

Hallo fmarx2000,

1. Du kannst einen Beitrag noch 15 Minuten lang editieren.

2. Fullquotes sind nicht notwendig. Zitiere nur den Teil, auf den Du Dich beziehst.

3. Bevor Du einen solchen Ton anschlägst, solltest Du Deine eigenen Angaben auf Fehler prüfen, denn das:

Originally posted by fmarx2000

a-b+c <> a - ( b +c )

ist falsch.

Das kann ja nicht wahr sein.
Denke ich auch.
Geschrieben

Hi...

ich denke auch, das das Ergebnis nur zwei sein kann...

denn:

Eine logische Addition ist eine binäre verundung mit Übertrag. PUNKT!!

eine Subtraktion dagenen ist eine adition mit einer negierten Zahl. PUNKT!

d.h. Ein Proz oder Compiler kann nur addieren und multiplizieren (ausnahme sind Divisionen durch vielfache von 2, die durch einen einfachen Shift ausgeführt werden).

Für unsere Rechnung heisst das:

d = a - b + c ---> d = a + (-B) + c = a + c + (-B) = (-B) + a + c.....

uns siehe da, die Reihenfolge der abarbeitung ist vollkommen unerheblich (Kommutativ-Gesetz)..

sagt mir, wenn ich mich täusche..

Gruß Taz

PS schon doof, wenn man dann den Post zweimal editiert...

Geschrieben
Originally posted by Hexagon

Hiho,

sagt mal, steh ich auf dem Schlauch oder was?

Also: a-b+c = a-(b-c)

Und: a-(b-c) != a-(b+c)

Warum ist das dann falsch?:confused:

Das stimmt ja auch.

Aber da a-b+c <> a - (b+c) kommen auch unterschiedliche Ergebnisse raus. Einmal 2 und dann die 0.

aber a-(b-c) <> a-(b+c) weil:

a-(b-c) = a - b + c

a - (b+c) = a- b -c

DAS MINUS VOR DER KLAMMER ÄNDERT EINIGES.

Wenn ich ein Minus vor der Klammer habe und ich diese weglassen will, dann muss ich

die Vorzeichen in der Klammer ändern .. so habe ich das mal gelernt.

Frank

Geschrieben
Originally posted by Klotzkopp

Hallo fmarx2000,

1. Du kannst einen Beitrag noch 15 Minuten lang editieren.

2. Fullquotes sind nicht notwendig. Zitiere nur den Teil, auf den Du Dich beziehst.

3. Bevor Du einen solchen Ton anschlägst, solltest Du Deine eigenen Angaben auf Fehler prüfen, denn das:

ist falsch.

Denke ich auch.

Wenn aber a-b+c = a - (b+c) ist dann müsste ja das Gleiche rauskommen.

3-2+1 = 3 - (2+1)

3-2+1 = 3 - 3

2 = 0 .... und was jetzt ?

Frank

Geschrieben
Originally posted by fmarx2000

Wenn aber a-b+c = a - (b+c) ist dann müsste ja das Gleiche rauskommen.

Vielleicht reden wir aneinander vorbei.

a-b+c = a-(b+c)

ist falsch. Das brauchst Du mir nicht zu beweisen ;)

In Deinem Beitrag schien es mir nur so, dass Du behauptet hättest, das sei richtig.

Geschrieben
Originally posted by Klotzkopp

Vielleicht reden wir aneinander vorbei.

a-b+c = a-(b+c)

ist falsch. Das brauchst Du mir nicht zu beweisen ;)

In Deinem Beitrag schien es mir nur so, dass Du behauptet hättest, das sei richtig.

Das habe ich nicht behauptet aber ich wundere mich warum sich der Originalposter wundert

das bei a-b+c was anderes rauskommt als bei a - (b+c) .

Es sind ja wohl offensichtlich zwei verschiedene Gleichungen deswegen wird das Ergebnis ja auch unterschiedlich sein.

Frank

Geschrieben

Das Problem aus der Sicht der diskreten Mathematik:

Der Ausdruck a - b ist eine Abkürzung für a + -b, wobei -b das additiv Inverse zu b ist. Die natürlichen Zahlen reichen also nicht aus, da bei den natürlichen Zahlen nicht für alle Elemente ein additiv Inverses in der Menge der natürlichen Zahlen existiert. Die Menge der ganzen Zahlen leistet dies. Die ganzen Zahlen bilden die algebraische Struktur eines Ringes (die natürlichen Zahlen sind eine Gruppe). Es gibt ein paar Axiome, die ein Ring erfüllen muß. Das hier entscheidene ist, daß ein Ring R (in diesem Fall Z für die ganzen Zahlen mit der Operation + eine kommutative Gruppe ist. Das bedeutet für uns:

(a+B)+c = a+(b+c)

a+0 = 0+a

a+(-a) = (-a)+a = 0

a+b = b+a

Für uns sieht die Sache nun folgendermaßen aus:

a-b+c = a+(-B)+c. Da Z mit + eine kommutative Gruppe ist, kann ich es beliebig umsortieren. Auf jeden Fall ist für a=3, b=2 und c=1 das Ergebnis immer 2!

Zum Thema UPN: a-b+c ist kein gültiger Ausdruck für UPN.

Die Aussage a-(b+c) = a-b+c ist in der Tat falsch, da diese Aussage für alle Bellegungen a,b,c element Z gelten muß. Um zu zeigen, daß die Aussage nicht gilt, brauche ich nur ein Gegenbeispiel:

a=2,b=5,c=5:

2-(5+5) = 2 - (10) = -8

2-5+5 = 2-0 = 2

2 != -8, damit ist die Aussage falsch!

HTH

Jan

Geschrieben

Danke !!!

Erinnert mich irgendwie an meine Algebravorlesung ... leider fast alles wieder vergessen ... aber zum Grossteil kann ich es doch irgendwie nachvollziehen.

Der Kern des Problems war ja das:

a - b +c <> a - (b+c) ist und somit das Ergebnis der jeweiligen Gleichung auch anders sein muss.

Frank

Geschrieben

Hallo,

wenn du schon mit UPN anfängst, dann auch im richtigen Zusammenhang.

Bei der UPN geht es darum, komplexe Formeln ohne Klammern anzugeben.

Dafür wird alles hintereinander geschrieben, wobei:

-Zahlen Operanden sind und

-Operatoren Verknüpfungen zwischen 2 Operanden beschreiben . Ein Operator wirkt auf die beiden Operanden direkt vor ihm. Die Anwendung eines Operators auf seine Operanden wird als Einheit betrachtet und ist wieder ein Operand.

Demnach würde aus:

a-b+c=d;

folgendes werden:

ab-c+=d

Ist in diesem Fall also sehr sinnlos, da keine Klammern existieren. ;)

Anderes Beispiel: (nicht von mir)


  1 2 + 3 / 4 * 5 6 - +

= ((((1 2 +) 3 /) 4 *) (5 6 -) +)  Klammerung durch Operatoren erzungen

= ((((1 + 2) / 3) * 4) + (5 - 6))  Infix-Notation

= 3


Gruß Jaraz

Geschrieben
Originally posted by Orffi

Der Ausdruck a - b ist eine Abkürzung für a + -b, wobei -b das additiv Inverse zu b ist

HTH

Jan

Das ist in der Mathematik richtig und bei Prozessoren erst recht, da diese nur addieren können... es gibt zwar auch den sub befehl, intern wird jedoch auch er als addition mit einer negierten Zahl gesehen...

siehe mein Statement oben..

gruß Taz

Geschrieben
Originally posted by TAZttDevil

Das ist in der Mathematik richtig und bei Prozessoren erst recht, da diese nur addieren können... es gibt zwar auch den sub befehl, intern wird jedoch auch er als addition mit einer negierten Zahl gesehen...

siehe mein Statement oben..

gruß Taz

Soviel ich weiss wird das Zweierkomplement gebildet und dann addiert was einer subtraktion gleichkommt.

Frank

Geschrieben

Nun will ich mal ein bisschen zur Aufklärung beitragen.

Ich bin weder zu doof für Mathematik (eckige Klammer vor runde Klammer vor Punktrechnung vor Strichrechnung, gleiche Operanden sind gleichberechtigt) noch möchte ich dieses Board mit dämlichen Postings füllen.

Ich habe hier eine Tabelle aus eine Buch vorliegen, welche aussagt, dass nacheinander auftretende gleichrangige Operatoren in einem Ausdruck gemäß Definition (+ vor -) von links nach rechts abgearbeitet werden.

Ich lese dies und frage meinen Dozenten.

Der sagt, dass es sich um irgendeine polnische Notation handelt und das Maschinen eigentlich so rechnen wollen, wir sie aber softwaregesteuert auf den menschlichen Rechenweg bringen.

Nun lese ich Eure Postings zum Thema UPN und denke, dass UPN dann wohl doch ganz was anderes sein muss, gell?

Ich war immer der Meinung, Matheregeln sind Matheregeln.

So, und nun an Kameraden wie z.B fmarx2000. :eek:

Woher kommt nur diese große Klappe!

Es ist ziemlich einfach sich als Fachmann in einem Gebiet hinzustellen und über andere Gericht zu halten von wegen Hauptschule und so.

Ich dachte, dies sei ein Fachforum für Leute vom Fach und die die es werden wollen und nix für Dummschwätzer, welche am liebsten noch beleidigend werden übers Forum.

Glückwunsch, aus Dir sprüht ja gradezu der Mut.

Ich steh zwar kurz vor dem Berufsabschluß, aber alles wissen kann ich auch nicht, also wollte ich mich erkundigen und den Fall für mich und vieleicht andere mit dem selben Prob klären.

Entweder anständige Postings und ordentliche Diskussionen oder Klappe halten.

Aus welchem Buch diese Tabelle stammt reich ich noch nach, muss erst noch nachfragen.

Es ist also Fakt, der Prozessor würde bei so einer Aufgabe hinten eine 2 liefern, richtig?

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...