Variable decementieren

Gast #3508940
Lesenswert?

Müsste man mal gucken was der Kompiler aus den Verianten baut...


Ich hatte erst diese Variante, funktioniert aber logischerweise nicht:
1
if (var--);

Aber das klappt ja wie gesagt nicht, die Sache mit der for Schleife hat 
irgebwie was.
#3508957
Lesenswert?

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.
Gast #3509001
Lesenswert?

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.
Gast #3509213
Lesenswert?

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?
Gast #3509829
Lesenswert?

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
Angehängte Dateien:
#3509857
Lesenswert?

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.
#3509883
Lesenswert?

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.
Gast #3510001
Lesenswert?

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
#3510132
Lesenswert?

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
1
int main()
2
{
3
  while( !sleeping() )
4
    count( sheep() );
5

6
  sleep();
7
}
Gast #3510138
Lesenswert?

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.
#3510154
Lesenswert?

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.

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