Syntaxfrage
-
Hi,
c=((m+1?m>>(8-2*p):0)|l<<2*p);was macht in diesem code das :0 ?
-
Na, das ist der ?:-Operator!
(m+1) ? (m>>(8-2*p)) : (0)
Wenn m+1 true ist dann gibt er (m>>(8-2*p)), wenn m+1 = 0 -> m = -1 dann gibt er 0 zurück.
-
Oder in if-else formuliert:
if(m + 1) { c = m >> (8 - 2 * p); } else { c = 0; } c |= 1 << 2 * p;Meiner Meinung nach ein typischer Fall, wo man besser die if-Anweisung genommen hätte. Sowas kann man nicht mehr sinnvoll lesen.
Grüssli
-
Meiner Meinung nach ein typischer Fall, wo man besser die if-Anweisung genommen hätte.Der Code stammt bestimmt aus einem Obfuscation Contest.
-
Dravere schrieb:
Oder in if-else formuliert:
if(m + 1) { c = m >> (8 - 2 * p); } else { c = 0; } c |= 1 << 2 * p;Meiner Meinung nach ein typischer Fall, wo man besser die if-Anweisung genommen hätte. Sowas kann man nicht mehr sinnvoll lesen.
Grüssli
Funktioniert mit ternaerem Operator und sinnvoller Einrueckung doch ganz gut.
c = m+1 ? m>>(8-2*p) : 0; c |= l<<2*p;
-
Dravere schrieb:
Meiner Meinung nach ein typischer Fall, wo man besser die if-Anweisung genommen hätte. Sowas kann man nicht mehr sinnvoll lesen.
Grüssli
Joah, irgendwie schon, aber dann doch wieder nicht, ich mag den ternären operator gerne und fände sowas elegant, wenn man die Übersichtlichkeit durch whitespaces und evtl klammern verbessert. So wie es steht ist das unter aller kanone.
-
YASC schrieb:
Funktioniert mit ternaerem Operator und sinnvoller Einrueckung doch ganz gut.
c = m+1 ? m>>(8-2*p) : 0; c |= l<<2*p;Wenn man den ternären Operator auf mehrere Zeilen verteilen und genaustens auf die Einrückung achten muss, damit der Code halbwegs lesbar ist, gewinnt man nichts mehr durch ihn.
operator?:ist vor allem für Fälle wiestd::cout << (AllesOK ? "alles in Ordnung" : "AAAH!") << std::endl;gedacht, wo man mit
ifCode duplizieren würde. Hier handelt es sich aber um eine einzelne Zuweisung. Durch die If-Abfrage hat man sprechende Schlüsselwörter, welche auch vom Syntaxhighlighting profitieren können.Im Weiteren finde ich persönlich folgende Punkte unübersichtlich:
- arithmetische Ausdrücke nicht explizit auf Null prüfen, sondern wie
boolbehandeln - in komplexeren Ausdrücken keine Leerzeichen verwenden
- arithmetische Ausdrücke nicht explizit auf Null prüfen, sondern wie