Mit !var wird die Variable negiert und nach bool gecastet. Mit nochmal
'!' wird die negation aufgehoben, es bleibt also ein Wert von 0 oder 1.
Dieser Wert wird von 'var' abgezogen, also 1 solange var vorher einen
Wert ungleich 0 hatte, andernfalls 0, eben kein abzug mehr.
Was stört dich an deiner Variante? Ist übersichtlich, kurz und jeder
sieht was passiert.
Ingo schrieb:> Ich hatte erst diese Variante, funktioniert aber logischerweise nicht:> if (var--);
So würds funzen:
1
if(!var--){
2
var=0;
3
}
Ingo schrieb:> Aber das klappt ja wie gesagt nicht, die Sache mit der for Schleife hat> irgebwie was.
Geschmackssache. Wenn, dann würde ich folgendes schreiben:
1
while(i--);
Ingo schrieb:> Reine Kosmetik
Schönheit ist relativ.
Roland ... schrieb:> Mit !var wird die Variable negiert und nach bool gecastet.
Laut K&R ist das Resultat int. Sowas wie bool gibt es nicht.
EDIT: Schreib doch mal was du genau tun willst und/oder poste deinen
Code. Dann können wir dir den "üblichen" Weg zeigen, sowas
hinzuschreiben.
Ein Gast schrieb:> Aber ist es nicht etwas sinnlos ein Programm zu schreiben, das intern> bis 0 zählt?
Die Vermutung liegt nahe, daß das Zählen nicht das einzige ist, was das
Programm machen soll.
be stucki schrieb:> Laut K&R ist das Resultat int. Sowas wie bool gibt es nicht.
Zumindest liegt das Ergebnis von '!!var' danach im Wertebereich die auch
eine bool abdeckt, also nur mehr zwei Zustände.
Roland ... schrieb:> be stucki schrieb:>> Laut K&R ist das Resultat int. Sowas wie bool gibt es nicht.>> Zumindest liegt das Ergebnis von '!!var' danach im Wertebereich die auch> eine bool abdeckt, also nur mehr zwei Zustände.
Außerdem gibt es sehr wohl sowas wie bool in C. Allerdings erst seit 15
Jahren.
Chris schrieb:> Rolf Magnus schrieb:>> Dann kannst du aber auch gleich schreiben>> while (var--)>> steht var danach bei 0 oder -1?
var steht danach bei -1. Der Schleifeninhalt wird aber nur bis 0
ausgeführt.
Rolf Magnus schrieb:> Chris schrieb:>> Rolf Magnus schrieb:>>> Dann kannst du aber auch gleich schreiben>>> while (var--)>>>> steht var danach bei 0 oder -1?>> var steht danach bei -1. Der Schleifeninhalt wird aber nur bis 0> ausgeführt.
Nur wenn var vorzeichenbehaftet ist.
Rolf Magnus schrieb:> Außerdem gibt es sehr wohl sowas wie bool in C. Allerdings erst seit 15> Jahren.
Wer redet überhaupt von C? In C wäre der Code vom OP jedenfalls
ungültig, da "if" dort klein geschrieben wird.
Dr. Sommer schrieb:> Rolf Magnus schrieb:>> Außerdem gibt es sehr wohl sowas wie bool in C. Allerdings erst seit 15>> Jahren.> Wer redet überhaupt von C?
be stucki, in dem Posting auf das sich meine Antwort bezieht.
Dr. Sommer schrieb:> In C wäre der Code vom OP jedenfalls ungültig, da "if" dort klein> geschrieben wird.
Welche Sprache wäre dir denn bekannt, die es auf dem AVR gibt und wo die
Zeile genau so wie sie da steht passt?
Rolf Magnus schrieb:> Welche Sprache wäre dir denn bekannt, die es auf dem AVR gibt und wo die> Zeile genau so wie sie da steht passt?
Keine Ahnung, vielleicht hat der OP eine Geheimsprache dafür? Er verrät
ja nichts.
Dr. Sommer schrieb:> Keine Ahnung, vielleicht hat der OP eine Geheimsprache dafür? Er verrät> ja nichts.
Es ist C.
Ein Gast schrieb:> Aber ist es nicht etwas sinnlos ein Programm zu schreiben, das intern> bis 0 zählt?
Bestehen deine Programme nur aus einer Zeile? Meine meist nicht ;)
Rolf Magnus schrieb:> Die Vermutung liegt nahe, daß das Zählen nicht das einzige ist, was das> Programm machen soll.
So ist es...
Anbei der Hauptcode. Es handelt sich um einen 3 phasigen
PWM-Sinusgenerator,
Ausgabe der PWMs erfolgt über Timer1, das Nachladen neuer Werte aus der
LUT erfolgt durch Timer3. PWM Frequenz ist 10kHz, die Sinustabelle hat
90 Werte.
In Abhängigkeit von PA1 wird von der Anfangsfrequenz von 3Hz eine
Frequenzrampe mit 1Hz/s bis auf 50Hz hochgefahren oder sofort 50Hz
bereitgestellt.
Man kann erkennen das das Decrementieren der Variable Startupdelay
meiner Frage entspricht.
Ingo
Und was gefällt dir da jetzt nicht daran?
Der Code ist kurz, übersichtlich, leicht zu verstehen, kann vom Compiler
problemlos optimal umgesetzt werden.
Ich würds im Sinne der Konsistenz anders formatieren
1
...
2
if(Startupdelay)
3
Startupdelay--;
4
...
aber ansonsten gibt es ausser dieser zugegebenermassen GEschmackssache
daran nichts auszusetzen.
Karl Heinz schrieb:> aber ansonsten gibt es ausser dieser zugegebenermassen GEschmackssache> daran nichts auszusetzen.
Am Gesamtcode oder am Codeschnippsel?
Ingo schrieb:> Karl Heinz schrieb:>> aber ansonsten gibt es ausser dieser zugegebenermassen GEschmackssache>> daran nichts auszusetzen.>> Am Gesamtcode oder am Codeschnippsel?
Am Schnipsel.
Ich würde "startupdelay" explizit verwenden, d.h. Konstrukte wie
1
if(!startupdelay){...}
die "startupdelay" als bool verwenden (obwohl es ein Zählerwert ist)
vermeiden. Also:
1
if(startupdelay>0)
2
startupdelay--;
Dieser Schritt kann natürlich auf alle möglichen Weisen paraphrasiert
werden, z.B:
1
startupdelay-=(startupdelay>0);
nur haben diese Idiome nur dann einen Sinn wenn sie dem Compiler
tatsächlich dazu bringen, besseren Code zu erzeugen (Ausdrücke die etwa
in verzwiegungfreien Code umgesetzt werden können, sind unter manchen
Architekturen schneller) oder helfen Programmierfehler zu vermeiden. Das
ist hier aber nicht gegeben wie ich das sehe.
Bzgl. des ersten Zwecks (bessere Codegenerierung) könnte dich diese
Seite interessieren:
http://graphics.stanford.edu/~seander/bithacks.html
Bzgl. des zweiten Zwecks schlage ich vor die Endlosschleife durch
1
for(;;){/*...*/}
auszudrücken, weil die meisten Compiler heutzutage für konstante
Schleifenbedingungen ("while(1)") eine Warnung ausgeben können - es ist
nämlich oftmals ein Programmierfehler.
Peter Dannegger schrieb:> Luther Blissett schrieb:>> var && var--;>> Hübsch.
Hübsch vielleicht, aber halt typischer C-Write-Only-Code. Nach dem
Grundsatz, ein Programm muss so unverständlich wie nur möglich
formuliert werden. Bei Anwendung moderner Softwareproduktionsmethoden
völlig inakzeptabel.
Gruss Reinhard
Schon gut, Marian.
Wir haben alle den Joke gesehen.
Allerdings ist der soooooo lustig dann auch wieder nicht.
Er ist fast so lustig, wie der hier
Q: Was macht ein Computer, wenn es nichts zu tun gibt?
A: Er führt das Programm aus
Wenn ich davon ausgehe, dass die Optimierung des Compilers in Ordnung
ist und ich den ganzen Sermon auch später nochmal überfliegen muss, so
käme für mich nur:
if (var!=0)--var;
infrage.
Notfalls auch noch:
if (var)--var;
Aber ich mag die implizite Typumwandlung nicht.
Das Resultat dürfte in den meisten Fällen das gleiche sein.
Konstrukte wie:
for(;var;var--); oder
while (--var); oder gar
var && var--;
sind in meinen Augen etwas für Masochisten.
Reinhard Kern schrieb:> Hübsch vielleicht, aber halt typischer C-Write-Only-Code. Nach dem> Grundsatz, ein Programm muss so unverständlich wie nur möglich> formuliert werden. Bei Anwendung moderner Softwareproduktionsmethoden> völlig inakzeptabel.
Genau. Für sowas gibt es den IOCCC. In produktiv eingesetztem Code hat
sowas nichts, aber auch gar nichts verloren.