If- Abfrage groeßer kleiner

#662197
Lesenswert?

@ Hannes (Gast)

>gibts eine Möglichkeit, dass unten kürzer zu schreiben?
>if ((x1-x2) > 30 && (x1-x2) < 100)

Wozu? Wiviel Million mal pro Sekunde soll das geprüft werden? 
Wahrscheinlich ist der Comiler schlau genug (x1-x2) nur einmal 
auszurechnen und das Egebnis zwischen zuspeichern. Wenn nicht, dann eben 
so
1
int tmp;
2
tmp = x1-x2
3
if tmp>30 && tmp<100)
MfG
Falk
Gast #662207
Lesenswert?

Spontan würde ich nein sagen.
Aber anschaulicher kann man es programmieren, damit
man auch in 2 Wochen noch auf den ersten Blick sieht,
was man da eigentlich gemeint hat.

z.B. so:
1
void BehandleWerteX1undX2(int x1, int x2)
2
{
3
  int differenz = x1 - x2;
4

5
  if (differenz < 30) return;
6
  if (differenz > 100) return;
7

8
  MachWasMitDenWerten(x1, x2);
9
}

Ich versuche solche tief verschachtelten Konstrukte wie:
1
if (a==0)
2
{
3
  if (b==3 && c==5)
4
  {
5
     if (d != a)
6
     {
7
        MachEndlichWas();
8
     }
9
  }
10
}

durch sowas wie oben zu vermeiden.
Gast #662351
Lesenswert?

wenn man Folgendes hat:

int x;
...

if ( (x<0) && (x>x_max) )
 {...}

kann man das auch so machen:

if ( (unsigned int)x > x_max )
  {...}

bei zwei Schranken, muß man halt vorher den Wert x entsprechend 
anpassen, sodaß es mit dieser Methode auch funzt.
#662577
Lesenswert?

Hannes wrote:
> Geht nicht auch, dass ich ein #define definiere, also "#define name
> text" und im Text dan nur den namen aufrufe und zurückbekomme, ob x in
> den Grenzen liegt?
>
1
#define IN_RANGE(x,min,max)  ((x) < (min) ? 0 : (x) > (max) ? 0 : 1)
2

3

4
void foo()
5
{
6
   if( IN_RANGE( a, 70, 100 ) )
7
     ....

Aber ob das klarer ist, ich weiss nicht :-)

Natürlich hätte man den ?: auch vermeiden können ...
1
#define IN_RANGE(x,min,max)  ((min) > (x) && (x) < (max))
... aber du wolltest ja kein &&

Wie immer gilt bei Makros: Vorsicht mit der Auswertung. Ein
1
   if( IN_RANGE( a++, 70, 100 ) )

geht kräftig in die Hose. Vermeidbar sind die Probleme mit einer
Funktion:
1
unsigned char InRange( unsigned char Value,
2
                       unsigned char Min, unsigned char Max )
3
{
4
  if( Value < Min )
5
    return FALSE;
6

7
  if( Value > Max )
8
    return FALSE;
9

10
  return TRUE;
11
}

Ein C Profi würde das aber so schreiben:
1
unsigned char InRange( unsigned char Value,
2
                       unsigned char Min, unsigned char Max )
3
{
4
  return (Value > Min) && ( Value < Max );
5
}
Gast #662702
Lesenswert?

Diese ganzen InRange()-Ansätze haben das Problem, dass nicht klar ist, 
ob die Schranken nun zum Wertebereich dazugehören oder nicht.

Darum ist der eindeutigste Ansatz wohl:
1
void blafasel(int x1, int x2)
2
{
3
  int differenz = x1 - x2;
4

5
  if ( differenz > 30  &&  differenz < 100 )
6
  {
7
    // Mach was
8
  }
9
}
Grundsätzlich ist es eine gute Idee, Prädikaten einen eigenen Namen zu 
geben. Der Name sollte aber IMHO Anwendungsfall bezogen sein. Also z.B.:
1
const int abweichung_minimal = 30;
2
const int abweichung_maximal = 100;
3

4
uint8_t ist_regelabweichung_klein(int soll, int ist)
5
{
6
  int differenz = soll - ist;
7

8
  return differenz >= abweichung_minimal && differenz <= abweichung_maximal;
9
}
10

11
void berechne(int soll, int ist)
12
{
13
  if ( ist_regelabweichung_klein(soll, ist) )
14
    return;
15

16
  // Mache den Rest...
17
}
Zusätzlich können diese kleinen Prädikatfunktionen noch "static inline" 
deklariert werden.
Gast #662709
Lesenswert?

> Diese ganzen InRange()-Ansätze haben das Problem, dass nicht klar ist,
> ob die Schranken nun zum Wertebereich dazugehören oder nicht.
>
> Darum ist der eindeutigste Ansatz wohl:
> void blafasel(int x1, int x2)

Naja...

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