Gast
#1978901
Hi ich habe eine Variable int a und möchte, dass diese maximal den Wert 10000 annimmt, egal wie oft ich a++ rechne. Kann man das irgendwie am Anfang deklarieren? Ich schreibe in C
|
Anzeige
|
Variable begrenzen in C
Gast
#1978901
Hi ich habe eine Variable int a und möchte, dass diese maximal den Wert 10000 annimmt, egal wie oft ich a++ rechne. Kann man das irgendwie am Anfang deklarieren? Ich schreibe in C Nein. int nA; if (nA < 10000) nA++; oder nA++; if (nA > 10000) nA = 10000; oder nA++; nA = nA % 10001; mfg.
Gast
#1978957
Schreib einfach:
Jürgen schrieb: > ink(a); // Anstelle von a++; Wenn schon, dann: a = ink( a );
Gast
#1978965
oder so... genau, vor allem in C.
Gast
#1978986
danke für die vielen Möglichkeiten, die if anweisung ist perfekt für mich!
Gast
#1979039
> Kann man das irgendwie am Anfang deklarieren? nein. > die if anweisung ist perfekt für mich! Da ist aber nichts am Anfang deklariert.
Gast
#1979041
Jürgen schrieb: > Schreib einfach: >
Was wohl passiert wenn a = 2^31-1 ist?! ;) Ich denke man sollte a nicht verändern wenn 10000 ereicht wurde. Wenn es konsequent auf 10000 limitiert wird, erscheint mir 2^31-1 eher unwahrscheinlich. D. I. schrieb: > Was wohl passiert wenn a = 2^31-1 ist?! ;) Ich denke man sollte a nicht > verändern wenn 10000 ereicht wurde. Eher so: unsigned int ink(unsigned int a, unsigned int maximum) { return (a++ > maximum - 1) ? maximum : a; }
Gast
#1979203
Samuel K. schrieb:
So, und hier die Frage an die C-Standard-Versteher: Ist der Rückgabewert davon jetzt a oder a+1 (für a < maximum)?
Gast
#1979206
>> Kann man das irgendwie am Anfang deklarieren? >nein. >> die if anweisung ist perfekt für mich! >Da ist aber nichts am Anfang deklariert. Ja gerade, weil es nicht geht, muss ich wohl mit der if anweisung leben...
Gast
#1979241
wie wär's damit?
[c]
...
ink(&a);
....
void ink(int *a){
if(*a<10000)(*a)++;
}
[\c]
Sequence Point schrieb: > Samuel K. schrieb: >
> > So, und hier die Frage an die C-Standard-Versteher: > > Ist der Rückgabewert davon jetzt a oder a+1 (für a < maximum)? Der Rückgabewert ist entweder maximum oder der bereits erhöhte Wert. Beim ? ist ein Sequence Point, damit ist dort die ++ Operation abgeschlossen.
Gast
#1979504
a = (a>=maximum ? maximum : a+1);
Gast
#1980167
a = (a<maximum ? a++ : maximum ); nö, wenn schon dann a = (a<maximum ? ++a : maximum ); oder a = (a<maximum ? a+1 : maximum ); Klaus Wachtler schrieb: > nö, wenn schon dann > a = (a<maximum ? ++a : maximum ); Oder halt einfah:
oder etwas verständlicher:
Man muß nicht auf Teufel komm raus den ?:-Operator verwenden. Das habe ich auch nie behauptet; vielmehr nur seine falsche Verwendung korrigiert. Noch mehr Varianten möchte ich diesem Thread nicht antun. Naja, vielleicht doch noch eine Variante (angelehnt an die häufige Implementation von errno über ein Makro und eine Funktion, die einen Zeiger auf die Variable liefert):
Das funktioniert weitgehend. Zu beachten ist nur, daß ++meineVariableA einen Wert liefert, der ggf. 1 über dem Maximum liegt:
Gast
#1980617
>nö, wenn schon dann > a = (a<maximum ? ++a : maximum ); Irgendwie bin ich gerade blind. Was stoert Dich an meiner Version mit dem Postincrement? a = (a<maximum ? a++ : maximum ); oder dann if (a<maximum) a++; chris schrieb: > Was stoert Dich an meiner Version mit > dem Postincrement? > > a = (a<maximum ? a++ : maximum ); Daß es nicht funktionieren wird (bzw. nicht definiert ist), sonst ist sie schön. Das Problem ist die Reihenfolge der Auswertung: Wenn a noch nicht maximum erreicht hat, geht es in das a++. Das liefert den alten Wert von a und erhöht anschließend a. I.d.R. wird dann der alte Wert zugewiesen, damit ist die Erhöhung für die Katz. M.W. ist diese Reihenfolge aber nicht sicher, es kann erst der alte Wert zugewiesen werden und dann die Erhöhung stattfinden. chris schrieb: > oder dann > > if (a<maximum) a++; Das dagegen ist in Ordnung, wenn auch viel zu einfach :-) Noch eine Variante, die wir noch nicht hatten: (a<maximum) ? a++ : (a=maximum); PS: Ich habe es eben mit dem gcc probiert. Da kommt bei deiner Version der alte Wert raus und eine Warnung: t.c:24: warning: operation on ‘a’ may be undefined Klaus Wachtler schrieb: > Noch eine Variante, die wir noch nicht hatten: > (a<maximum) ? a++ : (a=maximum); Da hätte ich auch noch mal was ganz anderes:
oder noch besser:
> Da hätte ich auch noch mal was ganz anderes: > a<maximum && ++a; Auch nett! Wobei die beiden Fälle dann merkwürdigerweise etwas ganz unterschiedliches liefern: entweder die 0 vom Vergleich oder den neuen Wert von a. Deshalb würde ich den Rückgabewert sicherheitshalber wegwerfen, auch wenn es vielen dann vielleicht noch merkwürdiger erscheint: (void)(a<maximum && ++a); Der zweite ist ja noch besser :-) Klaus Wachtler schrieb: > Wobei die beiden Fälle dann merkwürdigerweise etwas ganz > unterschiedliches liefern: entweder die 0 vom Vergleich oder > den neuen Wert von a. Das stimmt. Da könnte man jetzt aber prima den Komma-Operator einsetzen:
Dann kommt wie beim Vergleich selber 0 oder 1 raus. ;-)
Gast
#1981007
>a<maximum && ++a;
Oh, das ist aber haarig, wenn auch ziemlich trickreich. Man verlässt
sich ja voll auf die Reihenfolge der Ausführung. Ich frage mich, ob da
nicht ein Optimierer im Compiler was verdrehen könnte.
Gast
#1981010
>Deshalb würde ich den Rückgabewert sicherheitshalber wegwerfen
Die Zeile selbst hat ja keinen Rückgabewert. Deshalb müsste man den Wert
auch nicht wegwerfen, oder?
a<maximum && ++a; hat sehr wohl einen Rückgabewert, nur verwendet man ihn hoffentlich meistens nicht. Um eine versehentliche Verwendung zu verhindern (in der Art: a = a<maximum && ++a) finde ich den cast nach void angemessen. chris schrieb: >>a<maximum && ++a; > Oh, das ist aber haarig, wenn auch ziemlich trickreich. Man verlässt > sich ja voll auf die Reihenfolge der Ausführung. Ich frage mich, ob da > nicht ein Optimierer im Compiler was verdrehen könnte. na und? Das ist vollkommen legal, weil die Reihenfolge beim && und die short circuit evaluation in C verbindlich sind. Der Optimierer wird das auch wissen.
Gast
#1981758
Hallo, warum ++a oder a++? Wieso zweimal zuweisen? Kostet doch nur Zeit! a = (a < maximum ? a+1 : maximum) W.aldo schrieb: > Kostet doch nur Zeit! Ja, aber nur beim Übersetzen - der Optimierer wirft es doch eh weg. Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|