Kurzschreibweise if-Verzweigung

  • Kurzschreibweise if-Verzweigung

    Hallo,

    kurze Frage betreffend der Kurzschreibweise der if-Verzweigung. Ich habe untenstehenden Code der if-Verzweigung in die Kurzschreibweise "() ? :" umgewandelt.

    Der Codeschnipsel funktioniert, aber ich bin mir nicht sicher, ob diese Kurzschreibweise wirklich korrekt ist, obwohl sie die korrekte Ausgabe liefert?!

    Danke schon für die "Überprüfung"!

    Quellcode

    1. NSInteger a = 5;
    2. NSInteger b = 9;
    3. //if-Verzweigung (normal)
    4. if (a > b) {
    5. NSLog(@"a ist grösser b!");
    6. }
    7. else {
    8. NSLog(@"b ist grösser a!");
    9. }
    10. //Kurzschreibweise
    11. NSLog((a > b) ? @"a ist grösser b!" : @"b ist grösser a!");
    Alles anzeigen
  • Na, ja, es ist als bedingter Operator ein ternärer Operator, in C der einzige. Es kann natürlich beliebig viele ternäre Operatoren geben, die etwas ganz anderes tun. Kennt C bloß nicht. Ternär heißt hier lediglich, dass der Operator auf drei Operanden arbeitet.

    Wichtiger scheint mir zu sein, dass es ein Operator ist und daher keine Kurzschreibweise für ein if. Ein if wählt den Kontrollfluss von Anweisungen aus, während der bedingte Operator nur Ausdrücke zulässt. Diese können zwar immer zu Anweisungen gemacht werden, aber nicht umgekehrt.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Amin Negm-Awad schrieb:

    Wichtiger scheint mir zu sein, dass es ein Operator ist und daher keine Kurzschreibweise für ein if. Ein if wählt den Kontrollfluss von Anweisungen aus, während der bedingte Operator nur Ausdrücke zulässt. Diese können zwar immer zu Anweisungen gemacht werden, aber nicht umgekehrt.


    Jepp, das ist der Hauptunterschied. Nur als Ergänzung: Mit Blocks (und solider Schmerzfreiheit bezüglich ekeligem Code) geht's auch in die andere Richtung.

    Ein if..else ließe sich auch so schreiben:

    Quellcode

    1. int i=1;
    2. ((i>0) ? ^{
    3. NSLog(@"Groesser null");
    4. } : ^{
    5. NSLog(@"Nicht groesser null");
    6. }) ();


    Ob man das tun sollte, ist sicherlich eine andere Frage... :)
    Multigrad - 360°-Produktfotografie für den Mac
  • Inwiefern das über die Applewelt hinaus standardisiert ist, weiß ich nicht. Aber Apple setzt es seit 10.6 offiziell und fleißig ein, z.B. in - beginSheetModalForWindow:completionHandler: (NSSavePanel) oder - sortedArrayUsingComparator: (NSArray). Daher gehe ich davon aus, dass Blocks in ihrer jetzigen Form so bleiben werden.
    Multigrad - 360°-Produktfotografie für den Mac
  • Dass in Cocoa das an allen Ecken und Enden verwendet wird, ist klar. Sie haben es aber ganz bewusst nicht als Objective-C-Erweiterung ausgeprägt und zur Standardisierung in C vorgeschlagen. Meines Wissens liegt es da aber noch herum und harrt der Dinge.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Das ist auch mein Stand. Apple hat Blocks in ihren GCC-Branch und in LLVM reingebastelt. Technisch sind sie also da. Ob es irgendwann einen C-Standard geben wird, der Blocks beinhaltet (und wenn ja, ob das dann so aussehen wird, wie Apple es vorgeschlagen hat), steht in den Sternen. Finde ich aber auch nicht sooo wichtig. Bei der Vielzahl von C-Standards, Versionen, compilerspezifischen Variationen und ewig andauernden Diskussionen in den Standardisierungsgruppierungen habe ich mich von der Hoffnung, dass es irgendwann einen brauchbaren und einheitlichen Standard gibt, verabschiedet. Bei Objective-C 2 nehme ich sie mit, in reinen C-Projekten verlasse ich mich ohnehin nur auf den kleinsten gemeinsamen Nenner.

    Rein interessehalber: Findest Du es wichtig, ob Blocks zum C-Standard werden?
    Multigrad - 360°-Produktfotografie für den Mac
  • Ich programmiere kein C. Mir ist auch nicht die Rechtschreibereform in der Mongolei wichtig. Also nein.

    Blocks sind aber enorm wichtig. Das ist nur noch nicht richtig erkannt und wird von Apple auch nicht so kommuniziert. Deine Beispiele oben bekomme ich ohne Weiteres auch schon bisher mit IMP hin. Ich bekomme es sogar in C mit Funktionszeigern hin. Da gibt es ja keinen Unterschied. Das ist nicht wichtig.

    Der wirkliche Unterschied liegt darin, dass es sich bei den Blocks um Closures handelt. Damit besteht die Möglichkeit der echten funktionalen Programierung und vieles, vieles mehr. Meine Themenvorschläge zur Macoun beruhen auf dieser Eigenschaft, wobei ich IIRC gerade funktionale Programm noch nicht eingetragen habe, weil mein Account spinnt.

    In der Doku von Apple taucht das Wort "Closure" – glaube ich – gar nicht auf. Da gibt es noch Überraschungen.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Clusures sind lustig, keine Frage. Und dass Apple das Wort Closure mit keinem Wort erwähnt, ist mir auch aufgefallen. Ich vermute, dass die das absichtlich nicht machen, weil Closures (aus irgendwelchen unerfindlichen Gründen) die Konnotation anhängt, sie seien kompliziert. Ich finde es übrigens gar nicht schlimm, wenn der Vorschlag nicht in C reinkommt. Es ist ein höheres Sprachkonstrukt. C in seiner Grundform sehe ich eher als nett dekorierten Assembler.

    Du erzählst auf der Macoun etwas über Closures? Vielleicht fahre ich dann auch mal hin.
    Multigrad - 360°-Produktfotografie für den Mac
  • Ich beabsichtige es jedenfalls, einschließlich λ und Paralleliserung. Was genau dabei heraus kommt, weiß ich ohnehin erst am Tag des Vortrages.

    Aber eigentlich ist es ja die zweite Folge aus der Reihe "Der Code und sein Kontext – Eine Geschichte von Monogamie, Bigamie und Trigamie", die ich letztes Jahr mit AOP angefangen habe. Ich weiß nicht, ob das für Späteinsteiger interessant ist … ;)
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Amin Negm-Awad schrieb:


    In der Doku von Apple taucht das Wort "Closure" – glaube ich – gar nicht auf. Da gibt es noch Überraschungen.

    Das liegt wahrscheinlich daran, dass Blocks keine Closures sind. Sie können welche bilden, müssen es aber nicht.

    mattik schrieb:

    Ich vermute, dass die das absichtlich nicht machen, weil Closures (aus irgendwelchen unerfindlichen Gründen) die Konnotation anhängt, sie seien kompliziert.

    Scheint ja berechtigt, da hier auch Unsicherheiten mit der Definition auftreten ;)
    C++
  • Amin Negm-Awad schrieb:

    Selbstverständlich sind sie das. Dass man das nicht ausnutzt, ändert nichts an ihrem Wesen.

    Eine Funktion bleibt eine Funktio, auch wenn sie leer ist.

    Wie ich sehe, hast Du das Konzept von Closures nicht verstanden.

    Eine Funktions bleibt eine Funktion, auch wenn sie leer ist, das stimmt. Aber eine Klasse ist nicht automatisch etwa ein Singleton, nur weil sie es könnte - um mal hier analoge, hinkende Vergleiche zu bringen.
    Lies vielleicht einmal etwas Einführendes, ich kann z.B. die Englische Wikipedia hier empfehlen. Dort ist ganz am Ende auch ein Beispiel, wie man mittels Blocks in Obj-C eine Closure umsetzt.
    C++