Auswertungsreihenfolge von Parametern



  • Es gibt übrigens ein Proposal, was die Auswertungsreihenfolge spezifizieren will: http://isocpp.org/files/papers/n4228.pdf



  • Nathan schrieb:

    Es gibt übrigens ein Proposal, was die Auswertungsreihenfolge spezifizieren will: http://isocpp.org/files/papers/n4228.pdf

    Wo in dem void f().. Beispiel in der pdf ist etwas undefiniert?

    void f()  
    { 
        std::string s = "but I have heard it works even if you don’t believe in it" 
        s.replace(0, 4, "").replace(s.find("even"), 4, "only").replace(s.find(" don’t"), 6, ""); 
        assert(s == "I have heard it works only if you believe in it"); 
    }
    

  • Mod

    Frage1 schrieb:

    Nathan schrieb:

    Es gibt übrigens ein Proposal, was die Auswertungsreihenfolge spezifizieren will: http://isocpp.org/files/papers/n4228.pdf

    Wo in dem void f().. Beispiel in der pdf ist etwas undefiniert?

    void f()  
    { 
        std::string s = "but I have heard it works even if you don’t believe in it" 
        s.replace(0, 4, "").replace(s.find("even"), 4, "only").replace(s.find(" don’t"), 6, ""); 
        assert(s == "I have heard it works only if you believe in it"); 
    }
    

    Nicht undefiniert aber unspezifiziert: je nachdem wann find durchgeführt wird, werden unterschiedliche Teile des Strings ersetzt.



  • Versteh ich nicht.

    Die replace() werden ja nacheinander ausgeführt.

    replace(0, 4, "")
    dann replace(s.find("even"), 4, "only") (s nach dem ersten replace)
    dann replace(s.find(" don’t"), 6, "") (s nach dem zweiten replace)

    Wo gibt es da mehrere Möglichkeiten?!


  • Mod

    Die replace() werden ja nacheinander ausgeführt.

    Und was ist mit den find s?



  • Frage1 schrieb:

    Versteh ich nicht.

    Die replace() werden ja nacheinander ausgeführt.

    Es geht nicht um die replaces, sondern um die finds.



  • Na zuerst das find() im ersten replace, dann das find() im zweiten.



  • Du hast 5 Aufrufe, 2mal find, 3mal replace.

    s.replace(0, 4, "").replace(s.find("even"), 4, "only").replace(s.find(" don’t"), 6, "");

    Es ist klar, dass die replaces in ihrer Reihenfolge ausgeführt werden müssen. Es ist auch klar, dass das erste find vor dem zweiten Replace und das zweite find vor dem dritten replace ausgeführt werden muss. Darüber hinaus ist die Reihenfolge nicht spezifiziert, es gibt also folgende mögliche Ausführungsreihenfolgen:

    find find replace replace replace
    find replace find replace replace
    replace find find replace replace
    find replace replace find replace
    replace find replace find replace

    Bei den ersten dreien können die finds auch vertauscht sein, das macht also 8 Möglichkeiten, wenn ich keine vergessen habe. Einige werden gleiche Effekte haben, aber das spielt keine Rolle.



  • Und genau aus diesem Grund wollen die das definieren. 😃



  • Achso, verstehe.
    In solch einem zusammengesetzten Ausdruck steht überhaupt nicht fest, wann die Argumente ausgewertet werden.

    Weiß jemand, ob/wie es in Visual Studio festgelegt ist?



  • Ich weiß es nicht, aber ich gehe davon aus, dass es nicht festgelegt ist. Warum sollte man sowas machen? Das behindert doch den Optimierer.


Anmelden zum Antworten