0

私はC ++コードからアルゴリズムを理解しようとしている初心者です。その後、Javaで実装したいのですが、コードを理解するのが難しいことがわかりました。ここで私を混乱させた3つのコード

inline Edge *Node::NextEdge( Edge *prev)
       {
       for (int i = 0; i < 4; i++)
          prev = (Edge *) ( (int) prev ^ (int) edge[i] );
       return prev;
       }

// _ _ _ _ _ _ _ _ _ _ _ _ __ _ _ __ _ _ _ _ _ _ _ _ __ _ ___ _ _ _ _ _ _ _

if (nextfrag)
      {
      if ( --nextfrag->degree)
         new_frag( nextfrag, fragnum, len, edge );

// _ _ _ _ _ _ _ _ _ _ _ _ _ __ _ _ _ _ _ _ _ _ _ _ _ __ _ _ _ _ _ _

for (pedge = edge; pedge->parent; pedge = pedge->parent);

最初のコードに対する私の質問: ビット単位の Xor 演算で反復がどのように機能するか? とはprev = (Edge *) ( (int) prev ^ (int) edge[i] );どういう意味ですか? return の値はprev
2 番目のコードの質問: 減少演算子if ( --nextfrag->degree)は if ステートメントでどのように機能しますか?
3番目のコード:forステートメントを書く他の方法はありますか? 初心者として i= 0; を使用するだけなので、 for ステートメントの意味を説明してください。i= 何か; i++

ばかげた質問で申し訳ありませんが、あなたの説明は私を大いに助けてくれます、事前に感謝します:)

4

1 に答える 1

0
prev = (Edge *) ( (int) prev ^ (int) edge[i] )

(Edge *) は、結果を Edge オブジェクト (または struct ) へのポインターとしてキャストしています。

( (int) prev ^ (int) edge[i] )

式はポインタ 'prev' (エッジ) を int にキャストし、配列要素 edge[i] と XOR しています (この変数は範囲外であるため、型は不明ですが、エッジへのポインタの配列であると仮定しています) )。ポインター (アドレス) のサイズは int です。アルゴリズムが何であるかはわかりませんが、これにより、次の反復で別の Edge への新しい有効なポインター アドレスが生成されると想定されているようです。

--nextfrag->degree

この場合、「度」メンバーを持つ構造体へのポインターである nextfrag が指す度数メンバーをデクリメントします。

for (pedge = edge; pedge->parent; pedge = pedge->parent);

これは、pedge->parent == 0 (リンクされたリストの先頭ノード) まで、リンクされたリストをループします。

このコードは、ワード境界でパックされている構造に大きく依存しています。ポインター (アドレス) は 32 ビットまたは 64 ビットであるため、構造体を明示的にパックしないと、32 ビットまたは 64 ビット マシン間で異なる結果になる可能性があるため、これが実行されるターゲット コンピューターを完全に確信していない限り、これはかなり悪いコードです。「#pragma pack」を参照してください。

それはそれを理解するのを容易にしません。

于 2012-08-24T00:42:49.887 に答える