Bedingungsoperator ?:



  • Hallo,

    ich verstehe folgendes Problem nicht.

    Größter gemeinsamer Teiler soll ermittelt werden. Ausschnitt aus dem Code:
    while((x>y) ? x-=y : y-=x);

    Laut Definition soll der Bedingungsoperator doch das Ergebnis quasi in eine Variable schreiben. Also bspw. x = Bedingung ? Anweisung1 : Anweisung2. Hier aber werden beide Anweisungen ausgeführt, also 1 und 2 und eine Variable gibt es ja quasi nicht.

    Vielleicht kann mir jemand was dazu sagen. Danke schonmal.

    Viele Grüße



  • muschelfinder schrieb:

    Hier aber werden beide Anweisungen ausgeführt

    Wie kommst Du darauf?



  • muschelfinder schrieb:

    Hier aber werden beide Anweisungen ausgeführt, also 1 und 2.

    nein. Wenn x > y ist, dann wird Anweisung 1 ausgeführt. Ansonsten Anweisung 2.

    Und da das alles in einer while-Schleife steht, wird das solange ausgeführt, bis das Ergebnis "0" ergibt.

    du könntest es auch so schreiben:

    do
      int result = (x>y) ? x-=y : y-=x;
    while (result != 0);
    


  • Weil das Ergebnis der Funktion sonst nicht stimmt. Ich schreib diese mal komplett hin.

    int ggT(int x, int y)
    {
    	if (x && y)
    		while ((x>y) ? x-=y : y-=x);
    	return !(x||y)+abs(x+y);
    };
    

    Hier gibt es ja schonmal keine Variable, wo Anweisung1 oder 2 hineingeschrieben wird. Vielmehr schreiben die Anweisungen selbst in die verschiedenen Variablen. Dazu konnte ich schonmal keine Definition finden.

    Wie könnte man obiges in eine if-Anweisung packen, damit ich es vielleicht verstehe?

    EDIT: Vielen Dank erstmal für die schnelle Hilfe, das sehe ich mir direkt nochmal genauer an.


  • Mod

    muschelfinder schrieb:

    Wie könnte man obiges in eine if-Anweisung packen, damit ich es vielleicht verstehe?

    z.B. so

    int ggT(int x, int y)
    {
    	while (x && y)
    		if (x>y)
    			x-=y;
    		else
    			y-=x;
    	return !(x||y)+abs(x+y);
    };
    

    Der ursprüngliche Code testet jeweils unmittelbar ob das Ergebnis der Subtraktion 0 ist, um die Schleife abzubrechnen.


Anmelden zum Antworten