variable zwischen zwei werten setzen

Gast #4255137
Lesenswert?

Hallo,
gibt es irgend einen Befehl, mit dem ich eine Variable zwischen zwei 
werten setzen kann?
10<=x<=20
also x gebe ich als input. Wenn dieser kleiner gleich 10 ist, soll x=10 
sein. Ist x>20, soll x=20 sein. Ist x=12, soll x=12 bleiben.
bisher habe ihc es so
1
if(x<=10) x = 10;
2
else if(x>=20) x = 20;

nur eine reihe könne ich einen Wert auch mit dem Fragezeichen überprüfen
1
x = ((x>=20) ? 20 : x);
gibt es so etwas auch mit mehreren bedingunen? also, dass es eine zeile 
bleibt?

Mike
#4255222
Lesenswert?

Da nicht genau spezifiziert ist, welche C Geschmacksrichtung gemeint 
ist:
1
inline template<typename T> T clip(T _min, T x, T _max) {
2
  return min(max(_max,x),_max);
3
}
4
...
5
  int x = zufall();
6

7
  x = clip( 10, x, 20 );
8
...
Typesicher, schnell und ohne Doku verständlich. Über die 
Parameterreihenfolge kann man streiten, hier wurde auf "schön lesbarer 
Aufruf" optimiert. Schreibt einer, der seinen Basteltisch im 
1.Obergeschoß stehen hat.
#4255243
Lesenswert?

Walter T. schrieb:
> Hmmm....ich sehe den Sinn eigentlich eher in Operationen:
>
1
>  int a, b;
2
> 
3
>  ...
4
> 
5
>  b = clamp((long) b + a,INT_MIN, INT_MAX);
6
>
>
> Gibt es da auch schon etwas fertiges?

In Standard-C nicht.
Aber jeder Programmierer hat normalerweise sowieso ein 
Common-Verzeichnis, in dem er für ihn zugeschnitten Standard 
Funktionalitäten vorrätig hat.
Nur sehen halt meine Standard-Funktionalitäten anders als als deine. 
Irgendwo muss man dann auch im Standard-C sagen: bis hier her und nicht 
weiter. Alles darüber hinausgehende muss jeder Programmierer entweder 
selbst machen oder sich von irgendwo downloaden.
Früher war es halt zu 80% selber machen und zu 20% von anderen klauen. 
Heute hat sich das, nicht unbedingt zum Vorteil des Nachwuchses, 
umgedreht.

und ja: klar würde man das so schreiben.
Gerade mathematische Dinge bieten sich an, dass sie nach dem Muster 
funktionieren: Argumente sind Eingangswerte, der Returnwert ist für das 
Ergebnis reserviert.
In vielen anderen Fällen ist das nicht besonders sinnvoll, weil man oft 
auch noch einen Fehlercode im API unterbringen muss, aber für 
mathematische Funktionalitäten geht das oft und bringt den Vorteil, die 
Verwendung in Expressions zu ermöglichen.
#4255259
Lesenswert?

OK, laß mich die Frage anders stellen: Ich habe das "clamp"-Makro jetzt 
in meiner Header Sammlung und nutze es so:
1
 int8 a, b;
2
 
3
 ...
4

5
 b = clamp((long) b + a,INT8_MIN, INT8_MAX);

Ist das effizient? Schafft der Compiler das, zu erkennen, daß die Summe 
zweier INT8 niemals größer als INT16 wird und optimiert entsprechend, 
oder ist es sinnvoller, eine Funktion für diesen Datentyp zu schreiben, 
die das explizit berücksichtigt?
#4255285
Lesenswert?

Walter T. schrieb:
> OK, laß mich die Frage anders stellen: Ich habe das "clamp"-Makro jetzt
> in meiner Header Sammlung und nutze es so:
>
1
>  int8 a, b;
2
> 
3
>  ...
4
> 
5
>  b = clamp((long) b + a,INT8_MIN, INT8_MAX);
6
>
>
> Ist das effizient? Schafft der Compiler das, zu erkennen, daß die Summe
> zweier INT8

du hast hier keine INT8 mehr.
Du addierst einen long mit einem long. Und das Ergebnis hat wieder den 
Datentyp long.

Wenn du castest, dann gilt das auch.
#4255428
Lesenswert?

Karl H. schrieb:
> du hast hier keine INT8 mehr.
> Du addierst einen long mit einem long. Und das Ergebnis hat wieder den
> Datentyp long.

Das soll also vermutlich heißen: Der Compiler hat keine Chance 
festzustellen, daß der Wert, der sich aus der Summe der long int ergibt, 
vom Wertebereich immer in 16 Bit paßt und kann auch deswegen nicht 
entsprechend optimieren.

Danke für die Erklärung. Und jetzt gebe ich den gekaperten Thread auch 
wieder zurück. Wo ist der TO?
#4255443
Lesenswert?

Walter T. schrieb:

> festzustellen, daß der Wert, der sich aus der Summe der long int ergibt,
> vom Wertebereich immer in 16 Bit paßt und kann auch deswegen nicht
> entsprechend optimieren.

Mach dir die Sichtweise zu eigen:
Mit einem Cast überstimmst du den Compiler in allen Belangen. In wie 
weit ein Cast auch in die Optimierung mit hineingreift (gemeint ist: 
abschaltet), weiss nur der Compilerhersteller - in dem Fall greift man 
dann eher zur pessimistischen Sichtweise.

Ein Cast ist die C Form von "Gusch, hiazt red i"
(deutsche Übersetzung: Würdest du die Freundlichkeit haben, den Mund zu 
halten und einfach zur Kentniss nehmen, was ich gerade gesagt habe wie 
ich es haben will?"

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