Experiment: Wie viele Schlüsselwörter in einen Ausdruck?



  • Kleines Experiment: Wie viele C++11 Schlüsselwörter bekommt ihr in einen Ausdruck?
    Regeln:
    - Kein Schlüsselwort darf doppelt vorkommen.
    - Klammern sind im Ausdruck erlaubt.
    - Ihr dürft so viel Drumherum basteln wie ihr wollt, es zählt nur der eine Ausdruck, allerdings dürfen Schlüsselwörter, die im Drumherum schon verwendet wurden, nicht mehr im Ausdruck verwendet verwenden. Ausnahme ist das int von main.

    Na dann, auf gehts!
    Hier ist meins:

    void shit()
    {
        return throw decltype(sizeof(const volatile unsigned long int) xor alignof(signed()) and float() or double() || wchar_t() && bool() && char())();
    }
    
    int main()
    {
        shit();
    }
    

    Summe: 16 Schlüsselwörter.
    Wer kriegt mehr hin? 😉

    Edit: alignof hinzugefügt, sowie wchar_t. 18 Stück.
    Edit 2: bool hinzugefügt. 19.



  • Pack noch ein paar casts drum herum und nimm einen dependent name um noch ein typename reinzubringen.



  • #include <typeinfo>
    
    void shit()
    {
        return throw decltype(sizeof(const volatile unsigned) xor alignof(signed()) and static_cast<int>(float()) or reinterpret_cast<long*>(const_cast<std::type_info*>(&typeid(double()))) || wchar_t() && bool() && char())();
    }
    
    int main()
    {
        shit();
    }
    

    23 👍



  • Zu schwer zu testen, ultraschwer.
    Sagen wir, wer kriegt die meisten mit gcc?
    die 23 von PI sind bestätigt durch gcc.



  • Einverstanden 😉



  • wie gesagt: typename ist noch easy reinzugeben. dazu noch bitor, bitand, true, false, ...
    new ist noch easy

    wenn wir c++0x verwenden, dann koennen wir nen lamdba ausdruck reinnehmen und dann haben wir wieder massig neue keywords die wir nutzen konnen. Wobei wir dann definieren muessen was alles als EIN ausdruck gilt. Weil eine lambda Definition ist ja eigentlich ein ausdruck, besteht aber aus N statements...



  • Was man noch verwenden könnte, sind Literale wie false , true , nullptr . Oder weitere alternative Schlüsselwörter, siehe hier. Aber interessant wäre auch eine Version ohne sie – schliesslich sind wir zum Schluss gekommen, dass sie den Status eines Schlüsselwortes nicht verdienen 😉

    Kontrollstruktur- und Klassenschlüsselwörter dürften hingegen recht schwierig in einen Ausdruck einzubauen sein. Man kann zwar class X vor einen Klassentypen X schreiben, nur muss dieser zuvor schon einmal deklariert worden sein, was bereits class erfordert (nein, struct ist nicht erlaubt).



  • #include <typeinfo>
    #include <vector>
    #include <string>
    
    struct test
    {
            template <class blah>
            void shit()
            {
                    return throw decltype(sizeof(const volatile unsigned) && alignof(signed()) && static_cast<int>(float()) && reinterpret_cast<long*>(const_cast<std::type_info*>(&typeid(double()))) && short() && char16_t() && char32_t() && wchar_t() && this && true && false && char())(), delete new typename std::vector<bool>::iterator;
            }
    };
    
    int main()
    {
        test().shit<std::string>();
    }
    

    29, wenn ich mich nicht verzählt habe. 🕶



  • 314159265358979 schrieb:

    Ich war vielleicht zu ungenau, ich meine genau 1 Statement. Lambdas zählen also nicht.

    Nein. Oben hast Du einen Ausdruck verlangt. Ein Statement kann auch for und do und switch und verschachtelst alles haben.
    Nur ein Statement zu verlangen wäre zwar viel cooler, was die Anzahl der Schlüssenwörter angeht, aber ich fürchte, das wird zu einfach. Sozusagen, daß ein jeder fast alle unterbringt und es dann am Ende nur noch an eunem Trick hängt, wie dem sonderbaren return throw. Mir scheint, daß der Ausdruck als Herausforderung stärker den Profifricker vom Hobbyfrickler trennt.



  • Ich kenne mich nicht so aus, was nun was ist. Dann sei es ein Ausdruck.



  • typename std::vector<bool>::iterator
    

    ausserhalb eines Templates ist kein gültiges C++ :p



  • Richtig gestellt. Und jetzt dürft ihr auch mal Vorschläge zeigen. 😉



  • #include <typeinfo>
    #include <vector>
    #include <ctime>
    #include <iostream>
    #include <limits>
    
    int shit()
    {
        using namespace std;
        auto nullptr=(void*)0;//nur weil gcc den noch nicht kennt
        auto a=0,b=0,c=0,d=0;
        return
        (reinterpret_cast<unsigned long>((new class vector<volatile tm* //6
        >())->operator[](0)) or (signed short int) sizeof(typeid(delete //8
        (enum float_denorm_style*)nullptr)))+(float)static_cast<double> //5
        (wchar_t ( d and_eq c not_eq not(a or_eq b xor_eq 1 xor 2 )))+( //7
        true bitor (char32_t() bitand alignof(char16_t) and (char(compl //9
        (bool(false)))))) + vector<decltype(throw const_cast<tm*>(      //5
        dynamic_cast<const struct tm*>(new tm)))*>().size();            //4
                                                                        //=44
    }
    
    int main()
    {
        shit();
    }
    

    44, wenn ich mich nicht verzählt habe.



  • 😋



  • volkard schrieb:

    44, wenn ich mich nicht verzählt habe.

    new doppelt und dafür typename vergessen.



  • volkard schrieb:

    #include <typeinfo>
    #include <vector>
    #include <ctime>
    #include <iostream>
    #include <limits>
    
    int shit()
    {
        using namespace std;
        auto nullptr=(void*)0;//nur weil gcc den noch nicht kennt
        auto a=0,b=0,c=0,d=0;
        return
        (reinterpret_cast<unsigned long>((new class vector<volatile tm* //6
        >())->operator[](0)) or (signed short int) sizeof(typeid(delete //8
        (enum float_denorm_style*)nullptr)))+(float)static_cast<double> //5
        (wchar_t ( d and_eq c not_eq not(a or_eq b xor_eq 1 xor 2 )))+( //7
        true bitor (char32_t() bitand alignof(char16_t) and (char(compl //9
        (bool(false)))))) + vector<decltype(throw const_cast<tm*>(      //5
        dynamic_cast<const struct tm*>(new tm)))*>().size();            //4
                                                                        //=44
    }
    
    int main()
    {
        shit();
    }
    

    44, wenn ich mich nicht verzählt habe.

    Wenn du da noch´n switch-case-default-break drumrumbaust biste schon bei 48.

    Edit:
    Und in einem switch-case noch eine while-do Schleife mit continue, dann sind´s schon 51.



  • Aber dann ist es doch kein Ausdruck mehr, sondern ein Statement...



  • Wir haben doch gesagt, keine Abkürzungen, wie bitand, bitor, etc 😉
    int hast du schon bei int shit() verwendet.



  • Jetzt doch? Bitte Mal klare Spielregeln.



  • Nexus ist der Meinung, die alternativen Operatorschlüsselwörter seien doof. Und er behauptet, wir seien da einer Meinung. Das stimmt natürlich nicht. Außerdem ist die Einschränkung unnatürlich. Und sie war nur ein Vorschlag für einen alternativen Wettbewerb, also nicht ein Regeländerungsvorschlag für diesen. Und Du hast den Vorschlag nicht wie anderen Vorschlag abgesegnet. Ich hatte daher nicht angenommen, die alternativen Operatornamen seien ausgeschlossen.


Anmelden zum Antworten