Seltsames Programm vom Lehrer analysieren
-
Hallo und guten Abend liebe Gemeinde.
Ich habe von meinem Lehrer einen Programmcode bekommen, den ich als Hausaufgabe analysieren hätte sollen. Ich habe meine Gedanken einmal in grün bzw. in Kommentaren mit eingebetet...
#include <stdio.h> #include <iostream> using namespace std; void main() { int x = 1; int y = 2; int z = 3; int *zeig_y, *zeig_z; printf("Ergebnisse Beispiel 1\n"); zeig_y = &y; printf("%d \n", *zeig_y); // zeigt 2, da y=2 zeig_z = &z; *zeig_z = x; printf("%d \n", z);//zeigt, 3 da z=3 zeig_z = zeig_y; printf("%d \n", *zeig_z); //zeigt 2, da zeig_z = zeig_y = y = 2 printf("%d \n", z); //zeigt 3, da z = 3 int zahl_1, zahl_2, zahl_3, *pZahl, *pZahl_1; cout << "Ergebnisse Beispiel 2" << endl; zahl_1=5; zahl_2 = 9; pZahl = &zahl_3; *pZahl = zahl_1 + zahl_2; // 5+9 ergibt 14 cout << zahl_3<< endl; //14 wird ausgegeben pZahl = &zahl_1; zahl_1 = zahl_2 + zahl_3; // 9 + 14 ergibt 23 cout << *pZahl << endl; //23 zahl_2 = *pZahl / 2 * 7; //23 / (2*7) = 1 da Integer cout << zahl_2 << endl; //9 (*pZahl)--; //22 cout << zahl_1 << endl; //5 pZahl_1 = pZahl; //5 cout << --(*pZahl_1) << endl; //4 }Es kommen jedoch ganz andere Werte raus, als ich dachte bzw. gedacht habe zu lesen...
Welche Denkfehler hatte bzw. habe ich??
Danke für die Antworten im Voraus.
Gruß
Max
-
Beispiel 1 ist C, Beispiel 2 ist C++, analog die beiden Header, und das steckt der alles in *ein* Programm, und dann auch noch mit "void main()"??

Wenn du dich auch privat fürs Programmieren interessierst und damit weitermachen willst, solltest du deinen Lehrer besser nicht zu wörtlich nehmen und lieber mal nach jeder Unterrichtsstunde einen Blick in ein gutes Lehrbuch werfen...
Zur Frage:
Dein Denkfehler bei Beispiel 1 liegt in der zweiten Anweisung in Zeile 12. Kannst du formulieren, was da deiner Meinung nach passiert?
Beispiel 2:
Das Ergebnis, das du selbst in Zeile 24 ermittelt hast, ignorierst du in Zeile 25. Wie bist du dort auf die 9 gekommen?
Das gleiche Spiel machst du in Zeile 26 und 27 - wo nimmst du hier die 5 her?
-
dennis.cpp schrieb:
Beispiel 1 ist C, Beispiel 2 ist C++, analog die beiden Header, und das steckt der alles in *ein* Programm, und dann auch noch mit "void main()"??

Wenn du dich auch privat fürs Programmieren interessierst und damit weitermachen willst, solltest du deinen Lehrer besser nicht zu wörtlich nehmen und lieber mal nach jeder Unterrichtsstunde einen Blick in ein gutes Lehrbuch werfen...
Zur Frage:
Dein Denkfehler bei Beispiel 1 liegt in der zweiten Anweisung in Zeile 12. Kannst du formulieren, was da deiner Meinung nach passiert?
Oh mann ... ich muss genauer lesen.
*zeig_z = x;Da x = 1 ist, dann muss ja 1 ausgegeben werden.
Beispiel 2:
Das Ergebnis, das du selbst in Zeile 24 ermittelt hast, ignorierst du in Zeile 25. Wie bist du dort auf die 9 gekommen?
Das gleiche Spiel machst du in Zeile 26 und 27 - wo nimmst du hier die 5 her?Wie oben geschrieben ... ich muss besser bzw. genauer hinschauen...
Sorry
-
silent_max schrieb:
ich muss besser bzw. genauer hinschauen...
Sorry
Alles easy - jeder gemachte, bemerkte und verstandene Fehler, das gilt auch für Denkfehler, bringt dich im Verständnis der Sprache weiter.

-
Das will der Lehrer zwar vermutlich nicht hören, aber ...
int zahl_1, zahl_2, zahl_3, *pZahl, *pZahl_1; cout << "Ergebnisse Beispiel 2" << endl; zahl_1=5; zahl_2 = 9; pZahl = &zahl_3; // Müsste mMn. UB sein, Zeiger auf nicht initialisierte // Objekte zu erzeugen ist nicht erlaubt
-
Warum sollte das nicht erlaubt sein?
-
hustbaer schrieb:
Das will der Lehrer zwar vermutlich nicht hören, aber ...
int zahl_1, zahl_2, zahl_3, *pZahl, *pZahl_1; cout << "Ergebnisse Beispiel 2" << endl; zahl_1=5; zahl_2 = 9; pZahl = &zahl_3; // Müsste mMn. UB sein, Zeiger auf nicht initialisierte // Objekte zu erzeugen ist nicht erlaubtWarum? Das Objekt ist konstruiert und hat demzufolge ne Addresse.
-
Hmmm...
Kann sein dass ich mich irre
-
hustbaer schrieb:
Hmmm...
Kann sein dass ich mich irre
Natürlich irrst du dich.
Das ist Blödsinn. Der Wert vonzahl3ist unspezifiert, dass ist alles. Es gäbe keinen Unterschied, wäre zahl3 initialisiert - ihr Wert spielt bei dieser Operation noch keine Rolle. :xmas1:
-
Sone schrieb:
Außerdem ist
zahl3kein Objekt im Sinne des Standards, AFAIK. Für Klasseninstanzen - logisch. Aber nicht für Skalare.Das ist Blödsinn.
-
Sone schrieb:
Natürlich irrst du dich.
Das ist Blödsinn.Super, toll! Immer diese Großkotzigkeit hier. Belehrst du auch so deine Familie und Freunde. So kommen wir bestimmt alle weiter...
-
KasF schrieb:
Sone schrieb:
Natürlich irrst du dich.
Das ist Blödsinn.Super, toll! Immer diese Großkotzigkeit hier. Belehrst du auch so deine Familie und Freunde. So kommen wir bestimmt alle weiter...
Ja, aber die Adresse eines uninitialisierten Skalars zu nehmen ist doch wirklich etwas völlig normales. Das kann einfach nicht UB sein, das ist unmöglich.
Was ist daran Großkotzig? Anders wurde ich hier auch nie belehrt.
homersimpson schrieb:
Sone schrieb:
Außerdem ist
zahl3kein Objekt im Sinne des Standards, AFAIK. Für Klasseninstanzen - logisch. Aber nicht für Skalare.Das ist Blödsinn.
Ja, stimmt.
Der andere Punkt bleibt aber, der Wert spielt keine Rolle.
-
Ok, Standard erwähnt im Bereich §5.3.1/3 - §5.3.1/6 nichts dergleichen. Woanders sollte es nicht stehen.
-
Bei der Fülle an Informationsmenge die wir pro Tag aufnehmen, kann auch mal jemand wie hustbaer die falsche Information abrufen. Bleibt doch einfach sachlich und freundlich, du musst ja nicht den anderen alles nachmachen. Jetzt entschuldige dich bei hustbaer

-
hustbear, nach dem ich nun zum gefühlt tausendsten Mal diesen Text schreibe, weil ich nicht in Worte fassen kann wie furchtbar Leid mir die ganze Sache tut, will ich dir nur sagen, dass falls du mir, du guter, barmherziger Hustbär, eine zweite Chance gibst, wenn du mir diese schwarze unmenschliche Tat vergeben kannst, so will ich versprechen ein besserer Mensch zu werden und nie wieder dergleichen auch nur annähernd zu verüben.
Die Vehemenz mit der ich deinen völlig unbedeutenden Flüchtigkeitsfehler kritisiert habe war vollkommen überflüssig. Ich Monster!
Mein Vergehen kommt einem Mord an meine gute alte Mutter gleich.Wenn du mir jemals verzeihst, so werde ich für alle Lebzeiten unter deinem Gehorsam stehen und mit dir in jede Schlacht ziehen.
Bitte Vergib mir! Ich habe nichts als den Galgen verdient, hoffe aber auf einen viel zu guten Menschen!
Edit: Es tut mir sooo Leid!

-
Sone schrieb:
hustbear, nach dem ich nun zum gefühlt tausendsten Mal diesen Text schreibe, weil ich nicht in Worte fassen kann wie furchtbar Leid mir die ganze Sache tut, will ich dir nur sagen, dass falls du mir, du guter, barmherziger Hustbär, eine zweite Chance gibst, wenn du mir diese schwarze unmenschliche Tat vergeben kannst, so will ich versprechen ein besserer Mensch zu werden und nie wieder dergleichen auch nur annähernd zu verüben.
Die Vehemenz mit der ich deinen völlig unbedeutenden Flüchtigkeitsfehler kritisiert habe war vollkommen überflüssig. Ich Monster!
Mein Vergehen kommt einem Mord an meine gute alte Mutter gleich.Wenn du mir jemals verzeihst, so werde ich für alle Lebzeiten unter deinem Gehorsam stehen und mit dir in jede Schlacht ziehen.
Bitte Vergib mir! Ich habe nichts als den Galgen verdient, hoffe aber auch einen viel zu guten Menschen!
Das ist Blödsinn!
-
ScottZhang schrieb:
Das ist Blödsinn!
Hab ich untertrieben?

-
Da muss mehr kommen ...
-
Sone schrieb:
[...] Ich habe nichts als den Galgen verdient [...]
Und? ... worauf wartest du?
-
Ich fände das ja ulkig, wenn Sone nicht so ein grosser Depp wäre.
Ja, ich hab das verwechselt. Man darf den Wert des uninitialisierten ints nicht verwenden. Was übrigens auch viele als ganz normal ansehen würden.