Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hilfe bei C++



RPG-Man
05.12.2005, 15:31
Hallo Leutz,
ich habe ein ziemliches Logikproblem mit C++

a = 12

a+ = ++a + a++

Da kommt z.B. beim Kompiler "40" raus und wenn ich es rechne kommen "42" raus.

Mein Rechenschritt:

a+ = ++a + a++
a = ++a + a++ + a
a = 13 + 14 +15
a= 42

Kann mir jemand den richtigen Rechenschritt mit einer Erklärung geben? Wäre sehr dankbar weil ich dazu bald eine Arbeit schreibe.

Lukas
05.12.2005, 15:33
Afaik ist nicht genau definiert, was in so einem Fall passiert (Zuweisung an eine Variable, auf die im selben Ausruck ++ oder -- angewandt wird). Lass das am besten sein, ist eh ein saubererer Programmierstil.

DFYX
05.12.2005, 15:51
Doch, es ist sehr wohl definiert. ++a wird VOR der Zuweisung ausgeführt, a++ danach.

Heißt:

a = ++a + a + a; a = a + 1
=> a = 13 + 13 + 13; a = a + 1
=> a = 39; a = a + 1
=> a = 40

Dingsi
05.12.2005, 16:06
Ist trotzdem scheußlicher Programmierstil. Dringenst zu vermeiden. Außer man hats auf Obfuscation abgesehen. Da ist sowas sehr angebracht.

Inius
14.12.2005, 17:58
Ich habe ein Problem,bin noch an fänger und würde gerne wissen wo hier der fehler liegt.


//---------------------------------------------------------------------------

#include <conio.h>
#include <iostream.h>

//---------------------------------------------------------------------------

void main ()
{
int zahl;
cout<<"Um einen der Punkte auf zu rufen geben sie bitte die Nummer ein."<<endl;
cout<<""<<endl;
cout<<"Beispiel:1-Hilfe Dann geben sie folgendes ein: 1 "<<endl;
cout<<""<<endl;
cout<<"1-Hilfe"<<endl;
cout<<"2-Einfaches Rechen Programm"<<endl;
cout<<"2-Operatoren"<<endl;
cout<<""<<endl;
cout<<"Bitte geben sie jetzt einer der Zahlen ein"<<endl;
cout<<""<<endl;
cin>>zahl;
if(zahl=1)
{
cout<<"Text ausgabe für 1"<<endl;
}
else
{
if(zahl=2)
{
cout<<"Text ausgabe für 1"<<endl;
}
else
{
cout<<"Text ausgabe für 2"<<endl;
}
getch();
}

//---------------------------------------------------------------------------

MuadDib
14.12.2005, 18:12
Zum einen würde ich gerne wissen, was dein Problem ist, damit ich dir auch sagen kann, wo dein Fehler liegt, zum anderen würde ich auf den ersten Blick sagen, dass du Vergleiche mit == machen solltest, nicht mit dem Zuweisungsoperator.

Dingsi
14.12.2005, 19:04
MuadDib hat Recht.

if(zahl=1) { [...] }Der Code [...] würde immer (!) ausgeführt werden. Denn = ist der Zuweisungs- und nicht der Vergleichsoperator. Zurückgeben tut er den neuen Wert der Variable. zahl=1 ergibt also 1, was true entspricht. Genauso würde if(zahl=2) immer ausgeführt werden. if(zahl=0) dagegen nicht. Denn das ergäbe 0, was wiederum false entspricht.
Das was du willst ist ==. if(zahl==1) ergibt nur true wenn zahl wirklich 1 ist.

Lukas
14.12.2005, 19:27
Doch, es ist sehr wohl definiert. ++a wird VOR der Zuweisung ausgeführt, a++ danach.Das ist mir klar. Ich meinte, dass es meines Wissens nach nicht definiert ist, welchen Wert a bei a = a++ kriegen würde.

Inius
14.12.2005, 19:47
Ok,habe jetzt noch ein Problem,will das dass Programm erst beendet wir wenn man 4 eingibt,aber wie geht das jetzt das nicht gleich das fenster komplett schließt?Muss ich da eine schleife ein bauen?
wenn ja wie sieht das dann aus?
Test ausgaben bitte nicht beachten ausser die vor letzte^^.

//---------------------------------------------------------------------------

#include <conio.h>
#include <iostream.h>

//---------------------------------------------------------------------------

void main ()
{
int zahl;
cout<<"Um einen der Punkte auf zu rufen geben sie bitte die Nummer ein."<<endl;
cout<<""<<endl;
cout<<"Beispiel:1-Hilfe Dann geben sie folgendes ein: 1 "<<endl;
cout<<""<<endl;
cout<<"1-Hilfe"<<endl;
cout<<"2-Einfaches Rechen Programm"<<endl;
cout<<"3-Opperatoren"<<endl;
cout<<"4-Beenden"<<endl;
cout<<""<<endl;
cout<<"Bitte geben sie jetzt einer der Zahlen ein"<<endl;
cout<<""<<endl;
cin>>zahl;
if(zahl==1)
{
cout<<"!!!Du Idiot!!!"<<endl;
}
else
{
if(zahl==2)
{
cout<<"Geh mal googeln du sau^^!"<<endl;
}
else
{
if(zahl==3)
{
cout<<"Frag Bin Laden,Bin Arbeiten,Bin Fic... oder Bin Sche..."<<endl;
}
else
{
if(zahl==4)
{
cout<<"Was muss hier hin statt der Text ausgabe hin wenn sich das"<<endl;
cout<<"fenster schliessen soll?"<<endl;
}
else
{
cout<<"Diese Zahl gibt es nicht!"<<endl;
}
}
}
}
getch();
}

//---------------------------------------------------------------------------

Ynnus
14.12.2005, 20:24
1. Es ist empfehlenswert, die Code-Tags zu verwenden, das verbessert die Lesbarkeit. ;)

2. Ja, eine Schleife wär' nicht schlecht. Es empfielt sich eine Do-While Schleife mit der Abbruchbedingung, dass die Eingabe == 4 ist.

3. if { } else { if {} else {...}... kannst du zusammenlegen mittels if {} else if{ } else if {}, was wesentlich übersichtlicher ist. ;)

4. "void main()" ist kein gültiger C++ Code (mehr). Es muss jetzt "int main()" heißen.

5. Header besser ohne das ".h" einbinden und dafür "using namespace std;" unter die zwei Include-Anweisungen schreiben.

Feder
29.01.2006, 12:36
Ich meinte, dass es meines Wissens nach nicht definiert ist, welchen Wert a bei a = a++ kriegen würde.
Doch, das ist definiert. Da du die Variable davor deklariert haben solltest.
Bei deinem Beispiel würde die Variable a den selben Wert zugewiesen bekommen die es schon vorher hatte und anschließend um 1 erhöht.
Hätte es davor den Wert 10 gehabt würde es nach der Operation den Wert 11 haben.
Und wenn du es nur initialisiert hast, dann wäre der Wert nach der Operotion 1,
da wenn man es nur initialisiert die Variable immer den Wert 0 zugewiesen bekommt.



Ok,habe jetzt noch ein Problem,will das dass Programm erst beendet wir wenn man 4 eingibt,aber wie geht das jetzt das nicht gleich das fenster komplett schließt?
Am einfachsten ist es eine cin-Anweisung reinzunehmen.



"void main()" ist kein gültiger C++ Code (mehr). Es muss jetzt "int main()" heißen.
Seit wann das? Also ich kenne das so "void main(void)". Das mit "int main" ist mir noch unbekannt.
Was für ein Compiler benutzt du denn? o_O

Lukas
29.01.2006, 13:00
Seit wann das? Also ich kenne das so "void main(void)". Das mit "int main" ist mir noch unbekannt.
Was für ein Compiler benutzt du denn? o_Oint main(int argc, char* argv[]) war schon immer Standard. Leider gibt esa haufenwerise Tutorials, die empfehlen, main als void zu deklarieren, aber eigentlich ist das falsch.

Feder
29.01.2006, 13:27
int main(int argc, char* argv[]) war schon immer Standard. Leider gibt esa haufenwerise Tutorials, die empfehlen, main als void zu deklarieren, aber eigentlich ist das falsch.
Ich könnte dir das glauben, wenn das nicht in jedem Buch so stehen würde "void main(void)".
Das Fehler in den Tutorials auftretten können, das ist nicht zu bezweifeln,
aber in den Bücher...

Lukas
29.01.2006, 15:21
Ich könnte dir das glauben, wenn das nicht in jedem Buch so stehen würde "void main(void)".
Das Fehler in den Tutorials auftretten können, das ist nicht zu bezweifeln,
aber in den Bücher...Ich hab hier "DIe C++ Programmiersprache" von Bjarne Stroustrup, dem Erfinder von C++, rumliegen, und da steht's so drin, wie ich gepostet habe.

Feder
29.01.2006, 15:45
Also ich habe das Buch von Cristian Rousselle wo es so steht wie ich es geschrieben habe und ein anderes von Dirk Louis, wo es so steht wie du es sagtest.
In C++ gibts sowieso zigtausend Möglichkeiten für ein Problem.
Ausserdem wenn man bedenkt dass C++ auch C miteinschließt.
Ich würd mal sagen beides ist richtig.

MagicMagor
30.01.2006, 10:30
Nein "int main" ist korrekt, ansonsten würde der gcc kein korrektes C beherrschen was ich dann doch bezweifle. Soweit ich weiß ist "void main" etwas, daß VC++ erlaubt und dementsprechend wohl Einzug in diverse Tutorials und auch Bücher gefunden hat.

gcc gibt bei "void main" nämlich einen error aus. Das einzige was weggelassen werden kann sind die Parameter, aber "main" darf nicht void als Rückgabewert haben, sondern int.

Lukas
30.01.2006, 13:03
int als Rückgabetyp ist übriegns damit begründet, dass man auf der Kommandozeile (Scripte usw.) den exit-Status des Programms überprüfen kann. Wenn main 0 zurückgibt, ist das Programm korrekt gelaufen, ein exit-Status ungleich 0 zeigt für gewöhnlich einen Fehler an.

Feder
30.01.2006, 15:47
Nein "int main" ist korrekt, ansonsten würde der gcc kein korrektes C beherrschen was ich dann doch bezweifle. Soweit ich weiß ist "void main" etwas, daß VC++ erlaubt und dementsprechend wohl Einzug in diverse Tutorials und auch Bücher gefunden hat.

Das würde das ganze erklären. Ich habe nämlich wirklich Visual C++ als Compiler.
Gut, damit wäre das geklärt.