2017-07-02 8 views
-4

私はこのコードを実行したときに、なぜこのコードを実行するのかを理解する助けが必要です (8,8)(8,8)(0,8)(7,8)(6,8)(5,8)(4,8 )(3,8)(1,8)(0,8)(8,8)を画面に表示します。 関数gのイテレータuvで増分と減算の演算子がどのように動作するのか分かりません。 私はセットに0,1,3,4,5,6,7,8という要素があることを知っています。しかし、セットを通ってどのように歩いているのか分かりません。このコードは何をスクリーンに印刷しますか?

template <typename T> 
std::complex<double> g(T &u, T &v) { return {*--u, *v++}; } 

std::set<int> s{3, 8, 4, 7, 0, 1, 1, 5, 7, 3, 6}; 
std::set<int>::iterator v(s.begin()), w(s.end()); 
while (v != w) std::cout << g(v, w) << " "; 
std::cout << std::endl; 
+1

デバッグ方法をいくつか使用する必要があります。印刷デバッギングを使用するか、デバッガを使用して、実行中に1行ずつプログラムを実行します。それはプログラムの中で何が起こっているかを見ている方法です。 – Carcigenicate

+0

*実行すると、何が印刷されますか?あなたは何を期待しましたか?質問を編集して追加してください。 –

+0

私はそれをしましたが、反復子vが8の定数値を持つ理由はまだ分かりません。 – Lamija37

答えて

2

あなたはs.begin()をデクリメントし、s.end()をインクリメントしています。どちらも、の定義されていない動作になります。

+0

これは私のコードではありません。これは私の試験での質問で、私はこの部分が何をするのかを書かなければならなかった。私はs.begin(v)を減らすと何が起こるのか理解していますが、g関数で何が起こるのか分かりません。 – Lamija37

+1

@ Lamija37唯一の正しい答えは、「未定義の行動のせいで予測することができない」ということです。何が起こったのかを正確に知りたいのであれば、標準のライブラリコードを調べてみてはいかがですか? – HolyBlackCat

関連する問題