Zur Abwechslung eine theoretische Syntax-Frage: Gibt es eine Schreibweise ähnlich a=i++, die aber um einen anderen Wert als 1 erhöht? Ich meine nicht a=i+=n, denn das entspricht (für n=1) ++i und nicht i++ (beachte die Position von += und ++). Es geht mir um den Wert des Ausdruckes i+=n. Es geht um a) kompakte Schreibweise und b) kürzeste Ausführungszeit und Codegröße. Beispiele: i=5 n=2 (1) a=i++ --> a=5 i=6 (2) a=++i --> a=6 i=6 (3) a=i+=n --> a=7 i=7 ich will aber, dass wie in (1) a=5 ist, aber i um n erhöht wird. Klar kann ich schreiben (4) a=i; i+=n; die Frage ist, ob (und wie) das (mit einem Trick) in einem Befehl geht. Mein Vorschlag wäre (5) a=(+=i+=n); oder (6) a=(i+=n)-n; (7) a=++++i; für n=2 Zeile (6) wäre sogar syntaktisch richtig, aber ob ein Compiler schlau genug ist, zu erkennen, was ich meine? Dass er das richtig optimiert, nämlich dass er _auf die Variable i nur einmal lesend zugreifen_ braucht. (Die hier gegebenen Beispiele sind einfacher Natur, richtig wirkt sich das aus, wenn i kompizierte indirekt indizierte Variablen sind). Ich denke auch an Pointer: dort gibt es z.B. b = *feldptr++ Was aber, wenn ich in Zweierschritten durch das Feld springen will?
Versuche nicht, den Sourcecode auf Kosten der Lesbarkeit zu ,,optimieren''. Überlass das Optimieren dem Compiler. Deine Verrenkungen bringen im besten Falle gar nichts bei einem modernen Compiler, und im schlimmsten Fall kann kein Schwein mehr das Zeug in 3 Monaten lesen. ;-)
eProfi wrote: > Es geht um > a) kompakte Schreibweise und > b) kürzeste Ausführungszeit und Codegröße. ad a) Kompakte Schreibweisen sind vielleicht theoretisch interessant, aber notorisch inhärent unverständlich für andere -- und alsbald auch für dich selbst. ad b) Dafür gibt es keine Garantie und es ist zudem idR nicht spezifiziert, auf welches asm-Konstrukt ein bestimmtes C- oder allgemein Hochsprach-Konstrukt abgebildet wird. Das hängt ab von der Quellzeile, wesentlich vom Kontext, in dem sie steht, vom Compiler, von seiner Beschalterung und von der Plattform. Ausserdem wird ein aggressiv optimierender Compiler den Code erstmal bis auf Hemd und Socken auseinanderpflücken, bei gcc 4.x kann man das zB bestaunen, wenn man -fdump-tree-all angibt oder andere fdump-Optionen. Mal irgendein Treffer von Tante Gundel: http://developer.apple.com/documentation/developertools/gcc-4.0.1/gcc/Option-Summary.html
Die Schreibweise i++ bzw. ++i hat nur einen einzigen Vorteil (man hat ein paar Tastaturanschläge weniger), dafür aber sehr viele Nachteile (z.B. erschwerte Lesbarkeit), weshalb ich sie nur im Kopf einer for-Schleife oder als alleinige Anweisung verwende. for( i=1; i<C; i++) oder i++; Es gibt durch die Verwendung dieser Schreibweisen keinerlei Vorteil in der Ablaufgeschwindigkeit, evtl. ist sie sogar nachteilig, da der Ausdruck a = f( i++ ); möglicherweise wie folgt in Zwischencode übersetzt wird: I = i; i = i + 1; a = f( I ); (wobei I eine vom Compiler eingefügte Hilfsvariable ist.) Die Verwendug des ++-Operators ist sogar potentiell gefährlich, da die Reihenfolge der Auswertung von Teilausdrücken nicht durch ANSI standardisiert ist. D.h. der Ausdruck i = 5; a = f( i++, i, --i ); kann von verschiedenen Compilern unterschiedlich übersetzt werden und kein Compiler macht etwas falsch! Die Auswertung von links nach rechts berechnet f( 5, 6, 5), die Auswertung von rechts nach links hingegen f( 4, 4, 4 ). Deshalb rate ich von der Verwendung solcher Kurzschreibweisen grundsätzlich ab.
eProfi wrote: > Zur Abwechslung eine theoretische Syntax-Frage: > Gibt es eine Schreibweise ähnlich a=i++, die aber um einen anderen Wert > als 1 erhöht? a = (i += n)-n;
a=(b=i, i+=n, b); Sowas hat aber nur selten in Makros einen Sinn, echte Profis schreiben keine Zuweisungen mitten in Ausdrücke. Jürgen
Wer hat behauptet dass ich das so schreiben wuerde? Es war die Antwort auf die eingehende Frage. Leserlich wuerde man das so schreiben: a = i; i += n;
Ich würde mal sagen, solche Kurzschreibweisen sind Kandidaten für den 'Obfuscated C Contest': http://www.de.ioccc.org/main.html Ich schreibe lieber leserlich und übersichtlich und überlasse das Optimierfummeln dem Compiler, der kann das eh viel besser. Dafür finde ich mich selbst nach Monaten in meinem völlig unkommentiertem Code nach kurzem Nachdenken noch zurecht. Da stört es mich auch nicht, wenn ich dadurch mehr tippen müßte. Übrigens, gegen schmerzende Fingergelenke hilft eine gute Tastatur. ;-) Gruß Jadeclaw.
@Jadeclaw > 'Obfuscated C Contest': > http://www.de.ioccc.org/main.html WOW! Echt krasser Code, den die Typen da geschrieben haben. Und DAS ist compilierbar? Mal Hand aufs Herz: blckst du bei dem Code, den man dort online anschauen kann, durch? ;-)
@Tobias: Durchblicken? Keine Chance. Der Code muß aber lauffähig und mittels GCC compilierbar sein. Aus der FAQ: Q: What platform should I assume for my entry? A: Your entry must compile with GCC and run under at least one flavor of UNIX (e.g. Linux or Solaris). To improve chances to win, it should work under both BSD and SysV style UNIX (think stty cbreak), and should not depend on endianness. If it can compile and run on Windows and/or Mac (see 2000/thadgavin), even better. Gruß Jadeclaw.
Tobias Plüss wrote: > @Jadeclaw > >> 'Obfuscated C Contest': >> http://www.de.ioccc.org/main.html > > WOW! Echt krasser Code, den die Typen da geschrieben haben. Und DAS ist > compilierbar? Nicht alles und einiges nur unter Schmerzen ;)
@Jadeclaw
hmm, ich hab nirgends eine Beschreibung gefunden, was die Programme im
Endeffekt eigentlich tun sollten. Oder bin ich blind?
Also zumindest aus dem Code kann ICHs nicht rauslesen ;-))))
@Michael
Auch mal wieder hier unterwegs? ;-)
> einiges nur unter Schmerzen ;)
Jau, Augenschmerzen vom Anblick des Codes ;-) (da fällt mir spontan
www.augenkrebs.de.vu ein.... :p war jetzt ezwas OT, SCNR)
Es gibt zu jedem Progamm eine .hint-Datei mit Hinweisen zum Programm. Manchmal steht da drin, was das Programm macht, oder zumindestens wie man das Programm übersetzen und ausführen muss, damit man merkt, das es macht. Recht einfach zu verstehen ist das hier: http://www.de.ioccc.org/years.html#1994_smr Kategorie "Worst Abuse of the Rules", und gleichzeitig das kürzeste jemals eingereichte Programm. Bei dem hier steht der Zweck nich im hint, aber man findet es schnell selbst raus: http://www.de.ioccc.org/years.html#1988_robison Berechnet wird die Eulersche Zahl, das Programm nimmt als Parameter die gewünschte Stellenzahl und das zu verendende Zahlensystem entgegen. Und für einige Programme muss man nicht mal C können, weil sie auf dem Präprozessor beruhen: http://www.de.ioccc.org/years.html#1994_westley Sowas ist dann "Worst Abuse of the C Preprocessor", wenn ein komplettes Spiel nur mit dem Präprozessor gemacht wird...
> das kürzeste jemals eingereichte Programm
Sehe ich das richtig dass es sich aus einer einzigen leeren Datei
zusammensetzt? die Datei ist jedenfalls leer wenn ich sie runterlad'...
Schau dir den generierten Assemblercode an- Jörg Wunsch hat Recht.
Tobias Plüss wrote: > Sehe ich das richtig dass es sich aus einer einzigen leeren Datei > zusammensetzt? die Datei ist jedenfalls leer wenn ich sie runterlad'... Ja, darum ist es ja auch "worst abuse of the rules". Der Kommentar der Jury war ja auch, dass es streng genommen kein korrektes C- Programm sei, aber eben auch kein inkorrektes...
>Dass er das richtig optimiert, nämlich dass er _auf die Variable i nur >einmal lesend zugreifen braucht. Das muss der Compiler von selbst (unabhängig, wie du das schreibst) erkennen. Die meisten tun dies aber nicht. Erstens weil es (heute) nicht mehr notwendig ist und bestimmte Speicherzugriffe parallel zur Execution Unit (EU) ablaufen und zweitens, weil die Entwickler von Hochsprachen-Compilern auf solche "Kleinigkeiten" prinzipiell kein Auge werfen. Die Schreibweise (deiner Syntax) ist also egal, der Compiler macht es immer gleich schlecht...
1 | a=i;i+=n; |
ist IMHO die Schreibweise, wo der Compiler (zumindest der GCC) den besten Code generiert, außerdem ist sie auch vom Menschen lesbar. Fast alle bisherigen Vorschläge sind schlechter lesbar, haben einen längeren Quellcode (mehr Tipparbeit ;-)) und führen trotzdem zu schlechterem Maschinencode. Es gibt also nicht einen einzigen Grund, diese Verrenkungen anzustellen. Wenn das Ganze - warum auch immer - unbedingt in einer einzelnen Anweisung geschehen muss:
1 | a=i,i+=n; |
Der generierte Code ist gleich wie oben.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.