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++]));
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)? :-)
@ 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
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++]; |
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.