Funktion liefert immer den richtigen Wert ?!
-
Moin!
Da ich vor kurzem auch verwundert war, dass sowas möglich ist habe ich mal nachgeschaut.Das eigentlich ungewöhnliche ist ja, dass Du eingabe() als
int eingabe();deklarierst, aber für den Fall wert>=20 keinen Programmzweig - insbesondere kein return statement - hast.
Du "fällst" gleichermaßen aus dem Funktionskörper...Schauen wir also nach, was dazu im Standard steht:
ISO/IEC 14882:2011
6.6.3 The return statement
2. [...]Flowing off the end of a function is equivalent to a return with no value; this results in undefined behavior
in a value-returning function.
-
Morgen !
@Sascha
Ganz genau das ist auch Absicht. Ich möchte das in dem Fall (<20)kein Rückgabewert an die Funktion übergeben wird.Und somit das Ergebnis Zufall ist.@Zeus
Ich benutze KDevelop 3.x unter OpenSuse 11.
Und meiner Meinung nach müsste die Ausgabe so wie bei Dir Zufall sein d.h. da die Funktion als Integer vereinbart wurde irgendwo zwischen +-2,14 e9
Bei mir wird aber IMMER das richtige Ergebnis an die Funktion übergeben!!
Eigenart von KDevelop??
-
Zufall und undefiniertes Verhalten ist aber ein grosser Unterschied. Wenn man ketzerisch ist koennte man auch behaupten das dir die Platte um die Ohren fliegt.
Willst du eine pseudozufaelligen Wert, dann generier dir einfach einen mit den Standardmitteln und sorge so dafuer das deine Funktion definiertes Verhalten an den Tag legt.
-
Ist doch alles schön zufällig was du kriegst: du bekommst zufällig den Wert, der Eingegeben wurde. Andere kriegen zufällig einen anderen Wert. Ist doch hübsch.
-
Rokko schrieb:
Morgen !
@Sascha
Ganz genau das ist auch Absicht. Ich möchte das in dem Fall (<20)kein Rückgabewert an die Funktion übergeben wird.Und somit das Ergebnis Zufall ist.@Zeus
Ich benutze KDevelop 3.x unter OpenSuse 11.
Und meiner Meinung nach müsste die Ausgabe so wie bei Dir Zufall sein d.h. da die Funktion als Integer vereinbart wurde irgendwo zwischen +-2,14 e9
Bei mir wird aber IMMER das richtige Ergebnis an die Funktion übergeben!!
Eigenart von KDevelop??KDevelop ist eine IDE. Daran liegt es garantiert nicht. Es ist einfach egal, ob ich den Sourcecode mit KDevelop oder mit emacs oder vi erstelle.
Und undefiniert bedeutet, dass irgendwas raus kommt. Es ist auch keine geeignete Zufallszahl. Es kann sein, dass da immer die eingegebene Zahl zurück geliefert wird, da sie einfach im generierten code als letztes an die Stelle geschrieben wird, wo der Rückgabewert erwartet wird. Es kann auch sein, dass das Verhalten bei einem optimierten Build anders ist, als ohne Optimierung.
-
In meisten ( nicht allen Systemen ) wird der EAX Register zur Rückgabe der Werten benutzt.In deinem Fall bleibt da, der zuletzt verwendete Wert stehen. Da EAX auch einer der Meist/Zuerst genutzten Register ist, vermute ich mal, dass Du da die Adresse von cout(..) siehst.
Das ist aber stark Compiler/Build/Os abhängig. Seblst zwischen den Release und Debug mit gleichen Spacheinstellungen gibt es große Unterschiede.. Undefiniert halt.
-
Travor schrieb:
In meisten ( nicht allen Systemen ) wird der EAX Register zur Rückgabe der Werten benutzt.In deinem Fall bleibt da, der zuletzt verwendete Wert stehen. Da EAX auch einer der Meist/Zuerst genutzten Register ist, vermute ich mal, dass Du da die Adresse von cout(..) siehst.
Das ist aber stark Compiler/Build/Os abhängig. Seblst zwischen den Release und Debug mit gleichen Spacheinstellungen gibt es große Unterschiede.. Undefiniert halt.
Du meinst die Addresse von cin.

Der >>-Operator von cin klatscht das letzte Mal etwas nach RAX/EAX. Aber das gilt eigentlich auch nur wenn keine Optimierungen aktiv sind, sonst werden die Operationen inlined und RAX/EAX wird überhaupt nicht angetascht. Dann behaupte ich noch dass die Eingabe deswegen in genau diesem Register gespeichert wird, ergo steht da in jedem Fall der eingegebene Wert drin.
-
Hallo
ich hab ein neues Programm geschrieben indem der Wert geprüft wird und für den Fall das die Eingabe größer als 20 ist soll der Wert 0 an die Funktion eingabe() geliefert werden.
Dies Funktioniert auch nicht. Die Eingabe wird IMMER ausgegeben.
Jemand eine Idee ??/********************************
Funktion mit Eingabe und Prüfung
********************************/#include <iostream>
using namespace std;int eingabe()
{
int wert;
bool gelungen;
while (gelungen == false)
{
cout << "Bitte geben Sie eine Zahl kleiner als 20 ein: ";
cin >> wert;
if (cin.fail())
{
cout << "\nDie Eingabe war nicht gültig.\n";
cin.clear();
cin.ignore(BUFSIZ, '\n');
}
else
gelungen = true;
}
if (wert << 20)
{
cout << gelungen;
return wert;
}
else
return 0;
}
int main()
{
if (eingabe() == 0)
cout << "\nDie Zahl war größer als 20." << '\n';
else
cout << "\nDie Zahl lautet: " << eingabe() << '\n';
return 0;
}
-
Rokko schrieb:
if (wert << 20)
{
....
}Shift nach links mit 20 Stellen

-
bool gelungen;
while (gelungen == false)nicht initialisiert.
