Forum: Compiler & IDEs rechnen mit dem Ergebnis eines Vergleichs?


von ben (Gast)


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);

von Peter (Gast)


Lesenswert?

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.

von Rolf Magnus (Gast)


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.

von ben (Gast)


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.

von Klaus T. (gauchi)


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.

von Rolf Magnus (Gast)


Lesenswert?

Wie wäre es mit:

1
vector[ptr+1][3] = vector[ptr+1][2];
2
3
if (richtung == 1)
4
    vector[ptr+1][3]--;
5
6
if (richtung == 2)
7
    vector[ptr+1][3]++;

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von ben (Gast)


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).

von (prx) A. K. (prx)


Lesenswert?

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.

von ben (Gast)


Lesenswert?

...nicht geht

von ben (Gast)


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 
;-)

von (prx) A. K. (prx)


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 ;-).

von R. M. (rmax)


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;

von ben (Gast)


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.

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.