rechnen mit dem Ergebnis eines Vergleichs?

Gast #2079514
Lesenswert?

Hallo,

es geht um folgende Zeile:
1
vector[ptr+1][3]=vector[ptr+1][2]-(richtung==1)+(richtung==2);
Ich weiß das man es anders schreiben kann aber aufgrund der 
Übersichtlichkeit wollte ich es so schreiben. Warum funktioniert es 
nicht das man zu dem Wert aus vector[ptr+1][2] eins addiert wenn 
richtung==2 bzw. eins subtrahiert wenn richtung==1.

Gibt es eine Möglichkeit das zu machen ohne zwei if-Abfragen zu 
erstellen?

Müsste (richtung==1) nicht 1 bzw. 0 als Ergebnis der Abfrage liefern?


gleiches Problem weiter unten:
1
vector[ptr+1][3]=vector[ptr+1][2]+(richtung==4)-(richtung==3);
Gast #2079533
Lesenswert?

ben schrieb:
> Warum funktioniert es
> nicht das man zu dem Wert aus vector[ptr+1][2] eins addiert wenn
> richtung==2 bzw. eins subtrahiert wenn richtung==1.

Warum sollte es denn nicht funktionieren?

Peter schrieb:
> nein muss es nicht. Es muss 0 oder !0 liefern und !0 muss nicht 1 sein.

Nein. Ein Vergleich liefert immer 0 oder 1. Es wird lediglich umgekehrt 
dort, wo ein boolescher Wert erwartet wird, alles, was nicht 0 ist, als 
"true" interpretiert.
Gast #2079539
Lesenswert?

Peter schrieb:
> ben schrieb:
>> Müsste (richtung==1) nicht 1 bzw. 0 als Ergebnis der Abfrage liefern?
>
> nein muss es nicht. Es muss 0 oder !0 liefern und !0 muss nicht 1 sein.

Nagut das stimmt aber beim testen des Programms liefert es 
offensichtlich immer 0 egal welchen wert richtung hat.
#2079557
Lesenswert?

Du kannst mal das hier versuchen:
1
vector[ptr+1][3]=vector[ptr+1][2]+((richtung==1)?-1:((richtung==2)?+1:0))
(wahrscheinlich kann man da Klammern einsparen, aber da müsste ich jetzt 
über die Priorität des ?:-Operators nachdenken...)
aber ehrlich gesagt fände ich es so:
1
if(richtung == 1) {
2
  vector[ptr+1][3] = vector[ptr+1][2] - 1;
3
} else if(richtung == 2) {
4
  vector[ptr+1][3] = vector[ptr+1][2] + 1;
5
} else {
6
  vector[ptr+1][3] = vector[ptr+1][2];
7
}

oder so:
1
switch(richtung){
2
  case 1:
3
    vector[ptr+1][3] = vector[ptr+1][2] - 1;
4
    break;
5
  case 2:
6
    vector[ptr+1][3] = vector[ptr+1][2] + 1;
7
    break;
8
  default:
9
    vector[ptr+1][3] = vector[ptr+1][2];
10
}
übersichtlicher.
Moderator Persönliche Seite #2079584
Lesenswert?

Persönlich fände ich es deutlich übersichtlicher mit einem switch:
1
   ... temp;
2
   switch (richtung) {
3
     case 0: temp = vector[ptr+1][2]; break;
4
     case 1: temp = vector[ptr+1][2] - 1; break;
5
     case 2: temp = vector[ptr+1][2] + 1; break;
6
   }
7
   vector[ptr+1][3] = temp;

... wobei richtung vorzugsweise noch ein enum werden sollte.

Der sich daraus ergebende Code sollte bei einem vernünftigen Compiler
(wir sind ja im GCC-Forum ;-) identisch zu obigem "kompakten" Konstrukt
sein.
Gast #2079586
Lesenswert?

Ok es geht doch so wie ich im ersten Post geschrieben hab, ich Trottel 
hab nur vergessen richtung nach den benutzen auf 0 zu setzen und das hat 
einen  Fehler verursacht hat der so aus sah als ob +(richtung==x).
Gast #2079598
Lesenswert?

A. K. schrieb:
> ben schrieb:
>
>> Gibt es eine Möglichkeit das zu machen ohne zwei if-Abfragen zu
>> erstellen?
>
> Deine Zeile wird je nach zugrundeliegender Maschine und Qualität des
> Compilers aufwendigeren Code erzeugen als if-Abfragen.

Dieser Abschnitt wird nur 2 mal alle ~160.000 Takte aufgeführt da hab 
ich es lieber übersichtlich und "langsam" als Komplizieren und schnell 
;-)
#2079612
Lesenswert?

ben schrieb:

> Dieser Abschnitt wird nur 2 mal alle ~160.000 Takte aufgeführt da hab
> ich es lieber übersichtlich und "langsam" als Komplizieren und schnell

... aber wenn du diesen Code in ein paar Jahren erneut ansiehst, dann 
wirst du den Sinn der if-Version wahrscheinlich deutlich schneller 
erfassen, als die Version mit den eingerechneten Vergleichen. Erst recht 
jeder andere Leser.

Dem kannst du natürlich entgegenwirken, indem du selbsterklärenden Code 
durch den verknoteten Ersatzcode und ausführlich erklärende Kommentare 
ersetzt ;-).
#2079629
Lesenswert?

Ich weiß nicht, was mit "richtung" sonst noch passiert, aber evtl. läßt 
sich der übrige Code dahingehend anpassen, daß statt 1 und 2 die Werte 
-1 und 1 verwendet werden, dann kannst Du einfach schreiben:
1
vector[ptr+1][3] = vector[ptr+1][2] + richtung;
Gast #2079707
Lesenswert?

A. K. schrieb:

> ... aber wenn du diesen Code in ein paar Jahren erneut ansiehst, dann
> wirst du den Sinn der if-Version wahrscheinlich deutlich schneller
> erfassen, als die Version mit den eingerechneten Vergleichen. Erst recht
> jeder andere Leser.

Nagut aber wenn ich die 1 bis 4 die richtung neben 0 annehmen kann durch 
ein define mit hoch,runter,links,rechts ersetze dann kann ich den code 
sicher besser erfassen als mit noch einer if Schachtelungstiefe.
(mein koordinatenursprung ist oben links deswegen bei hoch -1 usw.)


@R. Max: Nein geht leider nicht, aber ich könnte richtung aufspalten in 
richtung_horizontal und richtung_vertikal, dann würde das funktionieren.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren