post-increment, nach jedem einzelnem Array-Zugriffe

OP #1986803
Lesenswert?
• ▲
▼
Hallo
folgendes Snippet zeigt, dass x2 nach der Ausführung den Wert 0x1111 
besitzt, da index erst nach Ausführung der kompletten Zeile erhöht wird.
Gibt es eine Möglichkeit den Increment nach Benutzung des Arguments zu 
erzwingen, so dass man tatsächlich innerhalb einer Code-Zeile auf zwei 
Arrayelemente zugreifen kann, ohnen index fest zu setzen?


uint16_t x2 = 0x7766;
uint8_t ii[2] = {0x11, 0x22};

index = 0x00;
x2 = (((ii[index++]) << 8)|(ii[index++]));
Gast #1986815
Lesenswert?
• ▲
▼
Oliver Rendgen schrieb:
> Gibt es eine Möglichkeit den Increment nach Benutzung des Arguments zu
> erzwingen, so dass man tatsächlich innerhalb einer Code-Zeile auf zwei
> Arrayelemente zugreifen kann, ohnen index fest zu setzen?

Nein, da der C Standard nicht festlegt, welcher der beiden Oder-Terme 
zuerst errechnet wird.

Außerdem wirds zeitlich nicht kürzer, wenn das gehen würde, daher die 
Gegenfrage, wofür das gut sein sollte (außer eine Zeile Code zu sparen)?
:-)
#1986958
Lesenswert?
• ▲
▼
@  Oliver Rendgen (rendgeor)

>erzwingen, so dass man tatsächlich innerhalb einer Code-Zeile auf zwei
>Arrayelemente zugreifen kann, ohnen index fest zu setzen?

Obfuscated C Kontest?

1
x2 = (((ii[index++]) << 8)|(ii[index++]));

Genialität besteht darin, komplexe Dinge einfach auszudrücken.

1
x2 = (((ii[index]) << 8)|(ii[index])); i++;
1
x2 = ii[index])*257; i++;

MFG
Falk
#1986977
Lesenswert?
• ▲
▼
Floh schrieb:
>> Gibt es eine Möglichkeit den Increment nach Benutzung des Arguments zu
>> erzwingen, so dass man tatsächlich innerhalb einer Code-Zeile auf zwei
>> Arrayelemente zugreifen kann, ohnen index fest zu setzen?
>
> Nein, da der C Standard nicht festlegt, welcher der beiden Oder-Terme
> zuerst errechnet wird.

Nicht nur das. Hier wird index zweimal beschrieben, ohne daß dazwischen 
ein Sequenzpunkt liegt. Dabei darf beliebiges rauskommen, da das 
Verhalten (nicht nur die Ausführungsreihenfolge) dieser Codezeile 
komplett undefiniert ist.

> Außerdem wirds zeitlich nicht kürzer, wenn das gehen würde, daher die
> Gegenfrage, wofür das gut sein sollte (außer eine Zeile Code zu sparen)?

Oliver Rendgen schrieb:
> Gibt es eine Möglichkeit den Increment nach Benutzung des Arguments zu
> erzwingen, so dass man tatsächlich innerhalb einer Code-Zeile auf zwei
> Arrayelemente zugreifen kann, ohnen index fest zu setzen?

Warum das unbedingt in einer Codezeile sein muß, ist mir zwar nicht 
klar, aber bitte:
1
x2 = ii[index++] << 8; x2 |= ii[index++];

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.