Forum: PC-Programmierung Frage zur zuweisung mit Fragezeichenoperator in c


von Marc (Gast)


Lesenswert?

Hallo,
ich habe eine frage. Bei folgender zuweisungwird nicht mehr kompiliert
1
x = direction == 1 ? x+=2 : x-=2;
Bekomme die Meldung
error: lvalue required as left operand of assignment
             x = direction == 1 ? x+=2 : x-=2;
Mit einem kleinem Pfeil auf das -=.
schreibe ich anstelle von x-=2 einfach nur einen Wert, wird durchgebaut. 
Warum geht das nicht mit dem -= ? x+=2 ist ja anscheinend auch kein 
Problem.

von Goofz (Gast)


Lesenswert?

Setz doch mal Klammern

von (prx) A. K. (prx)


Lesenswert?

Erklär lieber mal, was du mit diesem seltsamen Statement erreichen 
willst. Also mal vorausgesetzt, du hast nicht Samstag mit Freitag 
verwechselt.

von Yalu X. (yalu) (Moderator)


Lesenswert?

?: bindet stärker als -=

  https://en.cppreference.com/w/c/language/operator_precedence

Da steht also effektiv

1
x = ((direction == 1 ? x+=2 : x) -= 2);
2
//   <————— kein L-Value ——————>

Aber wahrscheinlich möchtest du etwas ganz anders, nämlich

1
x = direction == 1 ? x+2 : x-2;

: Bearbeitet durch Moderator
von Marc (Gast)


Lesenswert?

A. K. schrieb:
> Erklär lieber mal, was du mit diesem seltsamen Statement erreichen
> willst.

Eigentlich ist es ganz einfach was ich vorhabe.
Wenn
direction==1 ist, soll x um 2 erhöht werden,
ist
direction==0, soll x um 2 verringert werden.

von Goofy (Gast)


Lesenswert?

x = (direction == 1) ? x+=2 : x-=2;

so?

von Goofy (Gast)


Lesenswert?

Marc schrieb:
> Eigentlich ist es ganz einfach was ich vorhabe.

Dann tuste so:

direction == 1 ? x+=2 : x-=2;

von S. R. (svenska)


Lesenswert?

Goofy schrieb:
> x = (direction == 1) ? x+=2 : x-=2;

Wirkt kaputt.

Besser:
1
x = (direction == 1) ? x+2 : x-2;

Noch besser:
1
if(direction == 1)
2
  x = x + 2;
3
else
4
  x = x - 2;

von Kalr (Gast)


Lesenswert?

x += direction == 1 ? 2 : -2;

von Yalu X. (yalu) (Moderator)


Lesenswert?

Da direction nur die Werte 0 und 1 annehmen kann, also eine boolesche
Größe ist, würde ich stattdessen eine Variable vom Typ bool namens
forward oder rightward o.ä. verwenden und den Ausdruck so schreiben:

1
x += forward ? 2 : -2;

von Rolf M. (rmagnus)


Lesenswert?

Yalu X. schrieb:
> Da direction nur die Werte 0 und 1 annehmen kann, also eine boolesche
> Größe ist, würde ich stattdessen eine Variable vom Typ bool namens
> forward oder rightward o.ä. verwenden und den Ausdruck so schreiben:

Ich würde den Namen beibehalten und einen enum mit den Werten "forward" 
und "backward" oder wie immer sie heißen sollen verwenden. Am besten die 
2 noch durch sowas wie "speed" ersetzen, so dass diese magische Zahl 
auch noch verschwindet.  Ich würd's wohl auch ausschreiben und den 
?:-Operator hier gar nicht verwenden. Der ist ja eher dafür gedacht, 
zwischen zwei Werten auszuwählen. Hier wird aber eher zwischen zwei 
Oeratoren ausgewählt.
Würde also bei mir wohl in etwa so aussehen:
1
if (direction == Forward)
2
    x += SPEED;
3
else
4
    x -= SPEED;

Das finde ich am besten lesbar.

von mh (Gast)


Lesenswert?

Yalu X. schrieb:
> Da direction nur die Werte 0 und 1 annehmen kann, also eine boolesche
> Größe ist, würde ich stattdessen eine Variable vom Typ bool namens
> forward oder rightward o.ä. verwenden und den Ausdruck so schreiben:
>
> x += forward ? 2 : -2;

Ich bin ja in Zeiten von Spectre und Konsorten dafür möglichst jeden 
Branch zu vermeiden. Also:
1
x += 2 * (2 * forward - 1);
;-)

von Dirk B. (dirkb2)


Lesenswert?

@mh nochmal. 0 und -4 passen nicht

von mh (Gast)


Lesenswert?

Dirk B. schrieb:
> @mh nochmal. 0 und -4 passen nicht

Welche 0 und welche -4?

von Dirk B. (dirkb2)


Lesenswert?

? jetzt kann ich auch nicht mehr Punkt- vor Strichrechnung

von S. R. (svenska)


Lesenswert?

Oder man lässt den ganzen "direction"-Quatsch und definiert sich "speed" 
mit positiven und negativen Zahlen. Dann reicht "x += speed".

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.