a=++i; a=i++; a=i+=n C-Syntaxfrage

Gast #1010444
Lesenswert?

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?
Persönliche Seite #1010460
Lesenswert?

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

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

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

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

@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)
#1011127
Lesenswert?

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...
Moderator Persönliche Seite #1011160
Lesenswert?

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

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

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.

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