Hallo, gibts eine Möglichkeit, dass unten kürzer zu schreiben? if ((x1-x2) > 30 && (x1-x2) < 100) kann ich da das && irgendwie vermeiden und dieses kürzer schreiben, gibts da irgendeinen Trick? lg und vielen Dank für die Antworten
@ 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
weniger Schreibarbeit, besseres Programm, bei deiner Möglichkeit habe ich ja wieder ein && drinnen
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.
@ Hannes (Gast)
>weniger Schreibarbeit, besseres Programm,
Unsinn!
MFG
Falk
Es soll manche (nicht alle) Compiler geben die folgendes können:
1 | if (30 < x < 100) |
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.
Also quasi: if ((unsigned)(x1-x2-30) < 70) TuEs(); Krass. Herrlich selbsterklärend aber cool. Bin unsicher, ob da noch irgendwo +1 oder -1 fehlt.
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? lg
> Es soll manche (nicht alle) Compiler geben die folgendes können: > > if (30 < x < 100) Das kann jeder C-Compiler. Allerdings ist das Resultat nicht das erwartete.
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 | }
|
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.
> 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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.