Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

10.02.2008, 16:13

Seite 64/65 3.5 else if und verschachtelte if-Bedingungen

Hallöchen,

ich habe mir diesen Abschnitt jetzt ein paar mal durchgelesen und so im großen und ganzen verstehe ich die sache auch ausser mit den geschweiften klammern. Dieses Thema wurde davor leider nur sehr kurz angeschnitten und bereitet mir kopfzerbrechen

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
using namespace std;
int main ()
{
    int Spieleranzahl; //Anzahl der Spieler

    char charAuswahl; // Menüauswahl

    cout << "Wieviele Spieler: ";
    cin >> Spieleranzahl;

    // Falsche Antwort

    if (Spieleranzahl == 0)
    {
        cout << "Falsche eingabe";
    }
    else if (Spieleranzahl ==1)
    {
        cout << "Sie starten den Singleplayermodus";
    }
    //Multiplayer

    else
    {
        cout << "Multiplayer Spiel\n\n";
        cout << "(j)eder gegen jeden oder (t)eamspiel";
        cin >> charAuswahl;

        //Jeder gegen jeden

        if (charAuswahl == 'j')
        {
            cout << "jeder gegen jeden" << endl;
        }

        //teamspiel?

        else if (charAuswahl == 't')
        {
            cout << "teamspiel" << endl;
        }
        //Falsche eingabe

        else
        {
            cout << "falsche eingabe" << endl;
        }
    }
    return 0;
}


Ich weiss nicht warum z.B. nur:

C-/C++-Quelltext

1
2
3
{
            cout << "falsche eingabe" << endl;
        }


in geschweiften klammern ist und warum das nicht so aussieht:

C-/C++-Quelltext

1
2
3
4
5
{
else if (charAuswahl == 't')
        
            cout << "teamspiel" << endl;
        }


Also das der ganze befehl in einer geschweiften klammer steht.

Ich hoffe ich hab meine frage verständlich genug gestellt.

Ich weiss einfach nicht warum das so ist. ob das sein muss und was es bezweckt.

ich würde mich freuen wenn ich eine antwort bekommen würde.
Sorry für die blöde was manche bestimmt denken aber ich bin halt ein absoluter anfänger und komme auch schnell weiter in dem buch aber das kann ich mir einfach nicht erklären :-(

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

10.02.2008, 16:29

Also die geschweiften Klammern machen die einen Anweisungsblock mit eigenem Gültigkeitsbereich.

Zitat

in geschweiften klammern ist und warum das nicht so aussieht:

C-/C++-Quelltext

1
2
3
4
5
{
else if (charAuswahl == 't')
       
            cout << "teamspiel" << endl;
        }


Wie kommst du darauf, dass else if dort drinn ist? Ich würde so, sogar sagen, dass das gar nicht geht so.

Also

C-/C++-Quelltext

1
2
3
4
else if(charAuswahl == 't')
{
cout << "teamspiel" << endl;
}


Das heisst, dass wenn charAuswahl gleich t ist, dann wird der Folgende Anweisungsblock ausgeführt. Dort drinn kann beliebiges stehen.

Anderseits kannst du ach das schreiben:

C-/C++-Quelltext

1
2
else if(charAuswahl == 't')
 cout << "teamspiel" << endl;


Das bedeutet, dass wenn die Bedingung stimmt der nächste Anweisungsblock (Zeile) ausgeführt wird.

C-/C++-Quelltext

1
2
3
4
else if(charAuswahl == 't')
 cout << "teamspiel" << endl;

cout << "das hier" << endl;


Hier wird die 2 Ausgabe IMMER ausgegeben, weil sie NICHT von der Bedingung abhängig ist. Dafür musst du dann das schreiben:

C-/C++-Quelltext

1
2
3
4
5
6
else if(charAuswahl == 't')
{
 cout << "teamspiel" << endl;

 cout << "Jetzt wird auch das ausgegeben." << endl;
}


Somit wird nach der Bedingung der folgende Befehl (Also jetzt der Anweisungsblock) ausgeführt.

3

10.02.2008, 16:39

okay

danke für die schnelle antwort :-)

ich versuche das einfach mal so hin zu nehmen :-)
so teilweise verstehe ich das ja auch warum das so ist. aber so ganz noch nicht warum man diese nutzen muss.

ich komme da einfach nicht drüber warum das else z.B. nicht mit eingebunden werden muss nur darunter der befehl.

naja mir das zu erklären das ist glaub nicht so einfach ich bin halt blond :-)
und habe noch keine andere programmiersprache gelernt dies ist meine erste

habe gesehen du hast die antwort ergänzt oder sie wurde mir gerade nicht komplett angezeigt. ich denke mal ich habe es jetzt so weit verstanden :-)

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

4

10.02.2008, 16:55

Also wegen dem drinstehen.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
if (..)
{
 cout << "hmm" << endl;
}
{
 else if (..)
 {
   cout << "hmmmm" << endl;
 }
}


Das geht nicht, weil zu einem else if IMMER ein vorangeganiges if (..) vorhanden sein muss.

Hingegen könntest du unsinnigerweise das schreiben:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
if (..)
{
 ...
}

{
  if (..)
  {
    ...
  }
}


Das würde aber so nicht viel Sinn machen, da das neue if (..) einfach in einem neuen Block steht, der so nichts macht, ausser Code zusammenzufassen und einen Gültigkeitsbereich festlegen.

C-/C++-Quelltext

1
2
3
4
5
{
  int i = 2;
}

 cout << i << endl;


Das zum Beispiel geht nicht, da i in einem anderen Gültigkeitsbereich deklariert wurde.

Ich hoffe, dass es jetzt klarer ist. ;)

5

10.02.2008, 16:55

C-/C++-Quelltext

1
2
3
4
{
    else if (charAuswahl == 't')
        cout << "teamspiel" << endl;
}
Geht nicht, nein. Aber nur weil es ein else if ist und somit das else durch den neuen Scope keinen Bezug zum if hat.

C-/C++-Quelltext

1
2
3
4
{
    if (charAuswahl == 't')
        std::cout << "Teamspiel\n";
}
geht aber ohne Probleme. Auch wenn es da eigtl. nicht so sinnvoll ist, einen neuen Scope zu öffnen ;)

Bearbeitung
Zu spät ...
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Terep

Frischling

Beiträge: 46

Wohnort: Region Hannover

  • Private Nachricht senden

6

10.02.2008, 21:37

In C++ wird alles sehr formal und sehr systematisch geregelt. Das heißt nicht, dass es unbedingt logisch erscheinen muss. Dafür ist es für einen Nichtprofi viel zu tief geschichtet und hat viele Ausnahmen (aus praktischen oder anderen Gründen).

Das, was in {} steht, ist in der Regel eine Funktion, in der etwas getan wird.
Vor der { steht der Funktionskopf.

Rückgabetyp Funktionsname (Parameter)
{
Anweisungsfolge;
}

Es verwirrt, wenn die erkannten Regeln dann irgendwie gebrochen werden, wenn zum Beispiel hinter if es bei einer Anweisung ohne {} geht oder warum manchmal ein Semikolon nach } kommen muss.

Profis wissen das schon, ich sage mir, es ist halt so definiert worden und wurde dadurch zur Regel. Dies muss man dann akzeptieren bis man es besser weiß.

Terep :)

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

7

10.02.2008, 21:57

Zitat

In C++ wird alles sehr formal und sehr systematisch geregelt. Das heißt nicht, dass es unbedingt logisch erscheinen muss. Dafür ist es für einen Nichtprofi viel zu tief geschichtet und hat viele Ausnahmen (aus praktischen oder anderen Gründen).


Also mit der Zeit wird das alles logisch und auch klar, warum was gemacht wird. ;)


Zitat

Das, was in {} steht, ist in der Regel eine Funktion, in der etwas getan wird.
Vor der { steht der Funktionskopf.


Das würde ich so nicht sagen. Es ist ein Fall, aber sicher nicht die Regel. Die geschweiften Klammern sind ganz nützlich bei tief verschachtelten Funktionen um Überblick zu verschaffen und alles schön aufzuräumen.

Zitat

Es verwirrt, wenn die erkannten Regeln dann irgendwie gebrochen werden, wenn zum Beispiel hinter if es bei einer Anweisung ohne {} geht oder warum manchmal ein Semikolon nach } kommen muss.


Naja. Du kannst dir alles in geschweiften Klammern als 1 Block vorstellen kannst. Und wenn du nun eine if Abfrage hast, wird immer nur direkt die NÄCHSTE Anweisung ausgeführt. Und da ein Block als 1 Anweisung gehandhabt wird, wird alles dort drinn als Block behandelt.
Und das Semikolon nach manchen geschweiften Klammern kommt daher, dass dort eine Dekleration gemacht wurde.
Theoretisch könntest du nach so ziemlich jeder Zeile ein Semikolon machen.

Bsp:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
if (..)
{;;;
 ...
};

{;
  if (..);
  {;
    ...
  }
};;;;;;;;;;;;;;;;;;;


Das ist alles erlaubt und funktioniert. Mach einfach nicht viel Sinn. ;)
Sogar das bei den if's funktioniert. Nur muss man beachten, dass dort der nächste Anweisungsblock IMMER ausgeführt wird, da mit dem Semikolon die Bedingung beendet wird.

Nelrim

Frischling

Beiträge: 33

Beruf: Entwicklungskonstrukteur

  • Private Nachricht senden

8

11.02.2008, 11:32

Also ich hab mir das so gemerkt das in den geschweiften klammern immer all das steht was passiert wenn der ausdruck zuvor zutrifft oder aufgerufen wird.

also

C-/C++-Quelltext

1
2
3
4
5
6
7
wenn (if) (sosundso zutrifft)

dann: { alles was hier drinsteht machen }

wenn was andres (else if) (wasanderes trifft zu)

dann: { alles was hier drin steht machen }

oder auch

C-/C++-Quelltext

1
2
3
void Funktionsaufruf (parameter1, parameter2, parameterviele)

{ alles was hier drinsteht machen }


was ich bisher gesehen habe war das immer ähnlich in C++ und damit auch irgendwie logisch.

Durch die Verschachtelungsmöglichkeiten kann es natürlich sein das

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
if (erste bedingung zutrifft)
dann {
              if (zweite bedingung auch noch zutrifft)
                    {
                         alles machen was hier steht // hier trifft die erste und 2te Bedingung zu

                     }
             else 
                    {
                         alles machen was hier so steht  // hier trifft die erste Bedingung zwar zu aber nicht die zweite

                    }
        }
else

{ mach was ganz anderes}  // hier trifft weder die erste noch die zweite bedinung zu


hoffentlich hab ich dich damit nicht verwirrt, das ist so meine derzeitige "denkweise" wenn ich mir das so vorstelle wie c++ das macht. Aber ich bin selbst noch blutiger Anfänger.

EDIT: danke für den Hinweis Drakon, war nicht sicher ob man hier erschossen wird, wenn man offensichtlich nichtlauffähigen code als c++ code deklariert ;)

Nelrim
Auch der längste Weg beginnt mit einem ersten Schritt.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

9

11.02.2008, 12:07

Wenn es so funktionniert, kannst du dir es auch so vorstellen. ;)

Ps.

Auch für Pseudocode kannst du die cpp - Tags benutzen, macht das ganze wesentlich lesbarer.

Werbeanzeige