これは、複数の演算子を持つ式があいまいである場合、キャスト演算子の前に "キャスト"より上位の演算子が呼び出され、キャスト演算子の後に "キャストよりも下位の演算子が呼び出されます。 2 + 2 * 2
乗算のようにのは、お互いにキャスト可能です以下の二つのクラスについて考えてみましょう6をその結果、添加の前に実行されますが、いない8
する必要があります。
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();
}
をその後のは
E1 e1;
E2 e2;
を宣言してみましょう
とdo
(E1)e2++;
E1とE2の両方にoperatまたは++
なので、この式で最初に実行する必要があるのは、キャストまたはインクリメントですか?我々は(コードでの出現順に)3つのアクションを持っている。ここ
e1 * (E1)e2++;
:Precedence table最初に行うべきでインクリメント答え、そのプログラムを印刷
その後
E2 Post-inc
Cast E1 -> E2
、のは、より複雑な例を試してみましょう:乗算、キャスト、インクリメント。実行があれば何を注文するのですか?Precedenceテーブルでは、増分が1番目、キャストが2番目(増分以下)、乗算が最後であることが示されています。出力は次のようになります。
E2 Post-inc
Cast E1 -> E2
E1 * E1
括弧を使用して操作を簡単に並べ替えることができます。我々は(e1 * (E1)e2)++;
でe1 * (E1)e2++;
を置き換えた場合、我々は
Cast E1 -> E2
E1 * E1
E1 Post-inc
を得るでしょうそれは、[優先順位表]の行3以下のものを意味します(http://en.cppreference.com/w/cpp/language/operator_precedence )。 –