Schweres c++ Quiz?



  • Hi!
    Bin gerade zum prüfen meines Wissens über c++ auf dieses Quiz gestoßen.
    Muss sagen, obwohl ich schon eine ganze weile in c++ programmiere konnte ich hier noch dazu lernen und ich fand das Quiz ziemlich schwer.

    Wie seht ihr das?

    MfG
    QuizzzTime



  • Ich kann das Quiz leider nicht machen, die Radio Buttons werden nicht gerendert: https://i.imgur.com/SjPaCc6.png

    Ich kenne noch dieses hier: http://cppquiz.org/quiz/question/1
    Das gefällt mir, weil man da auch unspecified / implementation-defined / undefined unterscheiden muss.

    LG


  • Mod

    Z.T. ist das Quiz auch ungenau, Frage 17 fragt ob hier die Ausgabe von x Null ist, oder undefined:

    #include <iostream>
    
    int x;
    
    int main()
    {
        int y;
        std::cout << x << std::endl;
        std::cout << y << std::endl;
        return 0;
    }
    

    Das Verhalten ist aber sowieso undefiniert, weil auf y zugegriffen wird. Insofern habe ich undefined angeklickt, was inkorrekt war. Schlechtes Beispiel. Abgesehen davon bis 20 alle richtig, aber da kann man sich auch eigentlich nur schwer vertun, wenn man die Fragen richtig liest.

    Ich kenne noch dieses hier: http://cppquiz.org/quiz/question/1
    Das gefällt mir, weil man da auch unspecified / implementation-defined / undefined unterscheiden muss.

    Das finde ich auch deutlich besser, und da habe ich auch eine Frage selber abgeschickt. 🙂


  • Mod

    Arcoth schrieb:

    Das Verhalten ist aber sowieso undefiniert, weil auf y zugegriffen wird. Insofern habe ich undefined angeklickt, was inkorrekt war. Schlechtes Beispiel. Abgesehen davon bis 20 alle richtig, aber da kann man sich auch eigentlich nur schwer vertun, wenn man die Fragen richtig liest.

    Das ist wie bei den Intelligenztests: Man sollte nicht die intelligenteste (oder hier: korrekteste) Antwort liefern, sondern die Antwort, von der man annimmt, dass der Testersteller sie für die intelligenteste/korrekteste hält 🙂


  • Mod

    SeppJ schrieb:

    Arcoth schrieb:

    Das Verhalten ist aber sowieso undefiniert, weil auf y zugegriffen wird. Insofern habe ich undefined angeklickt, was inkorrekt war. Schlechtes Beispiel. Abgesehen davon bis 20 alle richtig, aber da kann man sich auch eigentlich nur schwer vertun, wenn man die Fragen richtig liest.

    Das ist wie bei den Intelligenztests: Man sollte nicht die intelligenteste (oder hier: korrekteste) Antwort liefern, sondern die Antwort, von der man annimmt, dass der Testersteller sie für die intelligenteste/korrekteste hält 🙂

    Die intelligenteste Antwort hängt wohl von der Intention ab. Wenn ich die Höchstpunktzahl erreichen möchte (was hier sowieso nicht möglich ist), dann agiere ich auch entsprechend. Wenn ich hingegen feststellen möchte, ob bei "undefined" tatsächlich "falsch" herauskommt, dann klicke ich das auch an. I.A. hast du aber Recht.



  • Das Ergebnis dieser Aufgabe fand ich nicht intuitiv.

    #include <iostream>
    
    struct A 
    { 
      virtual int foo(int x = 5) 
      { 
        return x * 2; 
      } 
    }; 
    
    struct B : public A 
    { 
      int foo(int x = 10) 
      { 
        return x * 3; 
      } 
    }; 
    
    int main(int argc, char** argv) 
    { 
      A* a = new B; 
    
      std::cout << a->foo() << std::endl; 
    
      return 0; 
    }
    

    Mögliche Antworten:
    10
    15
    20
    30
    ill-formed

    Mag einer gut begründen warum rauskommt, was rauskommt?


  • Mod

    Ohne mir die Frage auf der Seite anzuschauen: Es ist doch recht intuitiv, dass die Default-Argumente aus der statisch gefundenen Deklaration genommen werden. Schließlich muss der Compiler doch wissen, welche er auf den Stack schmeißen soll.

    <a href= schrieb:

    [dcl.fct.default]/10">A virtual function call uses the default arguments in the declaration of the virtual function determined by the static type of the pointer or reference denoting the object. An overriding function in a derived class does not acquire default arguments from the function it overrides.

    Also würde ich 15 tippen, d.h. das Resultat von B::foo(5) .



  • Meinem Verständnis nach hängt das damit zusammen, dass Default-Argumente nicht Teil des Rumpfes sind und somit auch nicht vererbt werden können. Default-Argumente sind Teil der Deklaration, daher hängt die Wahl der Default-Argumente davon ab, über welche Deklaration man die Funktion aufruft (nämlich die neuste im aktuellen Scope). Das ist auch der Grund, wieso man z.B. Default-Argumente redefinieren kann, den Funktionsrumpf hingegen nicht.
    Im Codebeispiel ist x 5, weil foo über A aufgerufen wird, dessen Definition von foo ein Default-Argument von 5 für x vorschreibt. Castet man den Zeiger a nach B* und gibt das dann aus mit static_cast< B* >( a )->foo() , so wird das Default-Argument 10 angenommen und die Ausgabe ist plötzlich 30.


Anmelden zum Antworten