Oznacza to, że jeśli wyrażenie z kilkoma operatorami jest niejednoznaczne, operatory, które są "nadlewane", zostaną wywołane przed operatorem obsady, a operatorzy, którzy są "pod rzutem", zostaną wywołani po operatorze rzutowania. Jak w 2 + 2 * 2
mnożenia powinny być wykonane przed dodaniem, wynikające 6, ale nie 8.
Rozważmy następujące dwie klasy, które są rzutować siebie:
class E2;
class E1 {
public:
operator E2();
E1 operator++(int) {
std::cout << "E1 Post-inc\n";
return *this;
}
E1 operator*(const E1&) {
std::cout << "E1 * E1\n";
return *this;
}
};
class E2 {
public:
operator E1() {
std::cout << "Cast E1 -> E2\n";
return E1();
}
E2 operator++(int) {
std::cout << "E2 Post-inc\n";
return *this;
}
E2 operator*(const E2&) {
std::cout << "E2 * E2\n";
return *this;
}
};
E1::operator E2() {
std::cout << "Cast E2 -> E1\n";
return E2();
}
takim razie zadeklarować
E1 e1;
E2 e2;
i do
(E1)e2++;
Zarówno E1, jak i E2 mają operat lub ++
, więc co należy zrobić najpierw w tym wyrażeniu: rzut lub przyrost? Precedence table odpowiedzi, że przyrost powinien być wykonane w pierwszej kolejności, a więc program wypisuje
E2 Post-inc
Cast E1 -> E2
Następnie spróbujmy bardziej skomplikowany przykład:
e1 * (E1)e2++;
Tu mamy 3 działania (w kolejności ich pojawienia się w kodzie) : mnożenie, rzucanie i przyrost. Co się stanie, jeśli wykonanie będzie?Tabela pierwszeństwa mówi, że inkrementacja jest pierwszym, rzut jest drugim (jest poniżej przyrostu), a mnożenie jest ostatnim, ponieważ znajduje się poniżej nich. Więc wyjście będzie:
E2 Post-inc
Cast E1 -> E2
E1 * E1
Pamiętaj, że możesz łatwo zmienić kolejność operacji za pomocą nawiasów. Na przykład, jeśli wymienimy e1 * (E1)e2++;
z (e1 * (E1)e2)++;
, będziemy się
Cast E1 -> E2
E1 * E1
E1 Post-inc
Oznacza to nic poniżej linii 3 w tabeli pierwszeństwa [] (http://en.cppreference.com/w/cpp/language/operator_precedence). –