Forum: Compiler & IDEs For bis einschließlich Null herunterzählen (schleife, loop, 0)?


von Info (Gast)


Lesenswert?

Wie kommt man in C elegant (optimal?) von x auf 0? Der TI Compiler bzw. 
die Codeanalyse schlägt vor, auf 0 zu testen sei effizienter. Allerdings 
ist der Endwert dann nicht Null. Und wie folgt ist es kein Test auf 0 
mehr:
1
#include <stdio.h>
2
#include "stdint.h"
3
void main(){
4
      int8_t i;
5
      for(i=5;i>=0;i--)
6
           printf("i = %d\n", i);
7
}

Bleibt da nur, bis 1 herunterzuzählen und dann 1 abzuziehen?

http://openbook.galileocomputing.de/c_von_a_bis_z/008_c_kontrollstrukturen_010.htm#mj0e01c5c1715a4bfc3d2c91245fd45535

von Hans (Gast)


Lesenswert?

Was spricht denn gegen die Variante, die Du nennst? Die ist klar und 
verständlich. Daraus effizienten Maschinencode zu erstellen ist Aufgabe 
des Compilers.

von Info (Gast)


Lesenswert?

Hier noch eine Idee
1
      uint8_t i = 5;
2
        for(;;)
3
      {
4
                printf("i = %d\n", i);
5
                
6
                if(!i--)
7
                    break;
8
      }

von Bitflüsterer (Gast)


Lesenswert?

Wenn ich mal scherzhaft so formulieren darf: Starre nicht wie die 
Schlange auf's Kaninchen. Es gibt auch noch Meerschweinchen und Mäuse. 
In diesem Zusammenhang while und do-while Schleifen.
1
#include <stdio.h>
2
#include "stdint.h"
3
void main(){
4
  int8_t i = 6;
5
  do {
6
    i--;
7
    printf("i = %d\n", i);
8
  } while (i != 0);
9
}

von Yalu X. (yalu) (Moderator)


Lesenswert?

Die allermeisten Prozessoren haben die Statusflags Z und N. Ist x das
Ergebnis der letzten Rechenoperation, die der Prozessoren durchgeführt
hat, dann ist
1
Z = (x == 0)
2
N = (x <  0)

Da diese Flags ebenfalls bei den allermeisten Prozessoren sowohl direkt
als auch invertiert abgefragt werden können, sind die die folgenden
Schleifenabbruchbedingungen
1
i == 0
2
i != 0
3
i <  0
4
i >= 0

und bei einem ordentlichen Compiler auch die zu den letzten beiden
äquivalenten
1
i <= 1
2
i > -1

alle gleich gut und ohne zusätzlichen Vergleichsbefehl in Maschinencode
umsetzbar.

Im Zweifelsfall kannst du dir ja den jeweils erzeugten Assemblercode
anschauen.

: Bearbeitet durch Moderator
von Info (Gast)


Lesenswert?

Komisch, ich dachte, ich hätte das schon versucht:
1
#include <stdio.h>
2
#include "stdint.h"
3
void main(){
4
  uint8_t i = 5;
5
  do {
6
    printf("i = %d\n", i);
7
  } while(i--);
8
}

Das funktioniert (http://codepad.org/wpkIjTgn), aber vorhin bin ich nur 
bis eins runtergekommen. Keine Ahnung, was da schiefgelaufen ist (evtl. 
"--i").

von Karl H. (kbuchegg)


Lesenswert?

Yalu X. schrieb:

> alle gleich gut und ohne zusätzlichen Vergleichsbefehl in Maschinencode
> umsetzbar.

Und zu guter letzt sind derartige Dinge in mehr als 99.5% aller Fälle 
NICHT der Ort im Programm, an dem man mit Optimierung ansetzt. Wenn es 
darum geht in einem Programm die letzten 100 Nanosekunden(!) 
rauszuholen, weil man die unbedingt und um jeden Preis benötigt, ja dann 
wird das relevant. Aber mit derartigen Optimierungen kann man aus einer 
lahmen Schnecke kein Rennpferd machen - die lahme Schnecke bleibt auch 
danach noch eine lahme Schnecke.

Langer Rede kurzer Sinn: Wenn TI sagt, dass das effizienter sein, dann 
wird das schon so sein. Aber effizienter heißt in diesem Zusammenhang, 
dass dein Programm um vielleicht 0.000001 % schneller läuft, was in der 
Praxis komplett irrelevant ist.
Ich kenn leider auch den Code von so ein paar 
Mikrooptimierungsanhängern: völlig sinnlose 'Optimierungen' auf 
Mikroebene, die de facto nichts bringen und nur den Code unleserlich und 
unwartbar machen. Dort wo sie auf hoher Ebene Optimierungen hätten 
vornehmen können, die dann auch tatsächlich etwas gebracht hätten, das 
haben sie links liegen gelassen. Dafür haben sie sich in ihren eigenen 
'Optimierungen' so verfangen, dass sie Fehler nicht mehr beheben können, 
weil kein Mensch mehr durchblickt, wie das alles eigentlich hätte laufen 
sollen. Aber Hauptsache man bringt Mikrooptimierungen an (die heutige 
Compiler in der Mehrzahl alle selbst beherrschen), weil man ja so ein 
toller Programmierer ist, der gaaaanz tolle Tricks kennt.

: Bearbeitet durch User
von Info (Gast)


Lesenswert?

Ja, da hast du recht, man muss aufpassen, wo man die Zeit reinsteckt. 
Trotzdem habe ich durch eure Hinweise dazugelernt - danke!

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
Noch kein Account? Hier anmelden.