Binden von mehreren Werten an int?



  • Hallo,

    bin auf ein mir bis datao unbekanntes Konstrukt in C++ gestoßen,
    dass sieht so aus:

    int i = (swap(foo,bar), 1);
    

    Führt man den Code aus ist i=1. Meine Frage ist nun, wie nennt sich dieses Konstrukt, warum macht man das und wie funktioniert es?

    Meine bisherige Vermutung sieht so aus:
    Es werden alle Ausdrücke in der Liste evaluiert und der Wert des letzten an i gebunden. Das erklärt aber nicht warum man das überhaupt macht. Da könnte man doch auch einfach die Befehle hintereinander schreiben und sich die Klammern sparen, oder nicht?

    Kleines Beispiel Programm:

    #include <iostream>
    void test() {}
    
    int main()
    {
      int i;
      i = (test(), 1, 3);
      std::cout << i;
      return 0;
    }
    

    Vielen Dank im Voraus!



  • p90 schrieb:

    Meine Frage ist nun, wie nennt sich dieses Konstrukt, warum macht man das und wie funktioniert es?

    Kommaoperator.



  • Hallo p90,

    Willkommen im C++-Forum.

    p90 schrieb:

    Meine bisherige Vermutung sieht so aus:
    Es werden alle Ausdrücke in der Liste evaluiert und der Wert des letzten an i gebunden.

    Das ist korrekt.

    p90 schrieb:

    Das erklärt aber nicht warum man das überhaupt macht. Da könnte man doch auch einfach die Befehle hintereinander schreiben und sich die Klammern sparen, oder nicht?

    Nicht in jedem Fall - z.B. in for-Ausdrücken. Ein Beispiel:

    for( int a, b; cout << "zwei Zahlen bitte> ", cin >> a >> b; )
            cout << "Die Summe ist " << (a+b) << endl;
    

    Gruß Werner

    PS.: 'voraus' schreibt man mit einem 'r'



  • Ah, Dankeschön, das Hilft auf alle Fälle schon mal sehr beim Verständnis!
    Also ist der Hauptgrund die Zusammenfassung von mehreren Expressions zu einer Expression.

    Dann gibt es aber in dem speziellen Fall, den ich dargestellt hatte, keinen Grund den Kommaoperator zu verwenden, oder?

    Also ist

    #include <iostream>
    void test() {}
    
    int main()
    {
      int i;
      i = (test(), 1, 3);
      std::cout << i;
      return 0;
    }
    

    äquivalent zu

    #include <iostream>
    void test() {}
    
    int main()
    {
      int i;
      test();
      i = 3;
      std::cout << i;
      return 0;
    }
    

    ?

    Ich frage deshalb da ich momentan Code lese in dem dieses Konstrukt sehr ausgiebig verwendet wird. Der Autor ist leider nicht mehr zu greifen aber alle anderen die mit dem Code gearbeitet haben meinen dass das wohl aus Performance Gründen gemacht wurde was für mich halt überhaupt keinen Sinn ergibt.



  • Ja, da hast du recht. Man kann Code damit absichtlich unübersichtlich machen. Es gibt keinen Grund für massenhaften Gebrauch des Komma-Operators.

    Vor allem was soll die 1 in dem Code tun?! Sie trägt zur Verwirrung des Lesers bei und tut sonst nichts!

    i = (test(), 1, 3);
    

    Und "Performancegründe" ist hier ein Schwachsinnsargument.



  • wob schrieb:

    Und "Performancegründe" ist hier ein Schwachsinnsargument.

    Das ist es sogar fast immer!
    Auf Performance ausgelegte Programmierwettbewerbe gewann ich oft, indem ich (wie sonst auch und nun erst recht) brutal einfach programmiert habe. Das ergibt am Ende mehr Übersicht, weniger Knoten im Kopf, in weniger Code kann sich weniger ungewollte Langsamkeit verstecken. Ich habe mir keine Fesseln angelegt durch frühzeitige Mikro-Optimierung: Und Tataa, das Erfassen in Code bringt Verständnis über das Problem. Ein Trick in der Anwendungswelt mehr p0wnt 1000 Tricks in der Adminwelt.
    Nur durch brutale Einfachheit in der Implementierung kann man überhaupt Features über Features hinzufügen.
    Ich pr0ggere immer mit dem hauptsächlichen Gedanken an Performance im Hinterkopf. AABER(!!!) mit der wesentlichen Maßgabe, daß ich nicht triviale Dinge zu tun habe wie

    x=a<<3;
    y=a<<1;
    z=x+y;
    
    z=10*a
    

    , sondern das tut der optimierende Compiler für mich. Das tut er immer. Und alles, was er heute nicht tut, tut er morgen.

    Dadurch wird der Code einfach. Ich liefere durch meine frühzeitige Performanceorientierung/(vielleicht Faulheit)/Weitsicht <= 5% der Fehler meiner Sitznachbarn an Kunden aus.

    Damit will ich sagen: Immer von Anfang an die endgeile denkbare Performance im Kopf zu anzustreben ist supi. Immer auf Details zu achten, die was verkomplizieren, und die nicht einzubauen…

    lölchen, Shlaer/Mellor, ich kann nicht so viel Rum trinken wie ich kotzen wöllte, um die zu bewerten. Nach einer Flasche falle ich bettschwer um. Kann mir nicht vorstellen, daß Shlaer/Mellor an Performance oder Fehlerfreiheit auch nur gekratzt haben.


Log in to reply