Priorität des Scope-Resolution Operators



  • Hallo,

    laut folgender Liste hat ja der Scope-Resolution Operator :: die höchste Priorität aller C++ Operatoren, sogar höher als die von Klammern wie z.B. ().

    Jetzt kann ich mir aber nicht wirklich einen Fall vorstellen, in dem die erhöhte Priorität des Scope-Resolution Operators eine Klammer "schlagen" würde. Unter dem obigen Link steht sogar (Zitat):

    "Beim Parsen werden höher gelistete Operatoren enger an ihre Argumente gebunden als weiter unten gelistete, und zwar so, als ob sie geklammert wären."

    Das klingt so, als hätten doch Klammern die höchste Priorität, was ja irgendwie ein Widerspruch wäre.

    Daher meine Frage: Warum hat der Scope-Resolution Operator nicht dieselbe Priorität wie die Operatoren mit Priorität 2? Und was wäre ein Code-Beispiel das zeigt, warum das notwenig ist?



  • @happystudent sagte in Priorität des Scope-Resolution Operators:

    Jetzt kann ich mir aber nicht wirklich einen Fall vorstellen, in dem die erhöhte Priorität des Scope-Resolution Operators eine Klammer "schlagen" würde.

    Worin sollte die Klammer denn den Scope-Resolution Operator schlagen?



  • @spiri sagte in Priorität des Scope-Resolution Operators:

    @happystudent sagte in Priorität des Scope-Resolution Operators:

    Jetzt kann ich mir aber nicht wirklich einen Fall vorstellen, in dem die erhöhte Priorität des Scope-Resolution Operators eine Klammer "schlagen" würde.

    Worin sollte die Klammer denn den Scope-Resolution Operator schlagen?

    Na beim Parsen.
    foo::bar () vs. foo :: bar()
    Die 2. Variante macht natürlich keinen Sinn, aber das ist ja egal. Die Priorität muss zum Parsen trotzdem höher sein, weil sonst halt Unsinn geparst würde, und man müsste immer (foo::bar)() schreiben wenn man keine Syntax Fehler bekommen möchte.


  • Global Moderator

    Ich habe nicht das Gefühl, dass @happystudent Funktionsaufrufklammern gemeint hat. Die aber natürlich die Klammern sind, die in der Liste gemeint sind. Die Prioritätsklammern sind aber kein Operator mehr im Sinne der verlinkten Liste, sondern grammatikalisch ein Sprachelement vergleichbar mit einem Literal. Das wäre so wie zu fragen, welche Priorität 4 hat. Das macht nichts und hat auch keine Priorität, das ist einfach nur da. Meinetwegen Priorität 0, wenn es unbedingt sein muss.



  • @happystudent
    Das haut schon hin, weil es um verschiedene Verwendung der Klammer-Zeichen mit unterschiedlicher syntaktischer und semantischer Bedeutung geht.
    Das was geringere Priorität als der :: Operator hat sind die Funktionsaufruf-Klammern. Also die in z.B. std::exit(0);.

    Das was sämtliche Prioritäten overruled sind dagegen die Klammern die zum "Klammern" von Teil-Ausdrücken verwendet werden, wie z.B. in std::cout << "5 & 7 = " << (5 & 7) << "\n";.

    D.h. a + b * c verhält sich wie a + (b * c) und nicht wie (a + b) * c.
    Und std::exit(0) verhält sich wie (std::exit)(0) und nicht wie std::(exit(0)) (was schonmal ein syntax error ist).



  • Ok, vielen Dank für die Aufklärung @hustbaer und @SeppJ , hatte nicht bedacht dass es zwei verschiedene "Arten" von Klammern gibt. So macht das natürlich Sinn.



  • @happystudent sagte in Priorität des Scope-Resolution Operators:

    hatte nicht bedacht dass es zwei verschiedene "Arten" von Klammern gibt. So macht das natürlich Sinn.

    Gibt mindestens drei: Priorität, Funktionsaufruf, C-Style Cast.