1

こんにちは皆さん、C++ コードを解釈しようとするのはこれが 2 回目です (私は非常に初心者です)。以下の C++ コードの意味を確認したいだけです。

//| Get other endpoint of an edge  |  
//+--------------------------------+    
inline Node *Node::NextNode( Edge *next)  
   {  
   return (Node *) ((!next) ? NULL : ( (int)next->node[0] ^ (int)next->node[1] ^ (int)this ) );  
   }

コードは、オブジェクトを int と int に変換/キャストしnext->node[0]next->node[1]XOR 演算子をビット値に適用することを意味しますか? 結果を参照として使用しNode*ますか? 事前に助けてくれてありがとう:)

4

4 に答える 4

2

はい、そうです。(三項とこれのキャストも無視しましたが)

十分に注意しないと、このようなコードは未定義の動作をし、移植性がなくなる可能性があることに注意してください (たとえば、x86-64 では、ポインターは int よりも大きくなります)。

于 2012-08-21T23:00:20.397 に答える
1

ここでの私の推測では、Edgeは 2 つの の間のエッジを表し、Node次のように定義されます。

struct Edge {
    Node *node[2];
    // perhaps other fields
}

の両方の要素を入力するnode必要があります。これらの要素は異なるノードを指している場合もあれば、同じノードを指している場合もあります。

さらに、ノード自体をエッジの 2 つの要素の 1 つとして含むオブジェクトNode::NextNode()のみを渡す必要があります (または NULL を渡すこともできます)。Edgenode

それを考えると、この関数は基本的に次と同等です

if (next) {
    if (next->node[0] == next->node[1]) return this;
    if (next->node[0] == this) return next->node[1];
    return next->node[0];
}
return NULL;

Antimony が指摘しているようにint、int より大きいポインタを持つアーキテクチャでは正しく動作しないようにキャストしているという点で、実際にはバグがあります。もちろん、不変条件を満たさない場合、関数は正しく動作しません (たとえばEdge、ノードを含まない を 2 つnodeの のいずれかとして渡します)。

于 2012-08-21T23:08:08.070 に答える
0
(int)next->node[0] ^ (int)next->node[1] ^ (int)this

next-> node [0]と[1]が明らかにポインターであるとすると、それらのXORは意味のない値を提供しますが(それらが等しいという些細な場合を除いて)、XORを使用thisすると意味のあるものが生成されるという期待があります。 、node []値の1つがであることがわかっているのでthis、そうでない方が残っていると思いますthis。言い換えると、このシナリオでは、コードはおそらく次と同等であることが意図されています。

next->node[next->node[0] == this]

(または、それが少しわかりにくい場合はnext->node[next->node[0] == this ? 1 : 0]、C ++ではtrue1に変換されfalse、数値が予想される場合は0に変換されます)

ソースコード「エッジの他のエンドポイントを取得する」のコメントはこれをサポートしているようです。これは明らかにthis1つのエンドポイントであり、コードは「他の」エンドポイントを検出します。

有効なポインタを生成する別のシナリオは、node[0]node[1]が同じである場合です。この場合、thisが返されます。このシナリオがサポートされることを意図している場合(実装の偶然の一致だけでなく)、上記の提案された単純化は失敗します。あなたは試すことができます:

next->node[0] == next->node[1] ? this : next->node[next->node[0] == this]

実行時データに2つの同一のノード値が含まれる可能性があるかどうかについて疑問がある場合は、この置換の方が安全です。

他の人が指摘しているように、コードはポインタがと同じサイズであると想定していますがint、これはかなり厄介です!他の場所で死ぬまで行われているので、それについては説明しませんが、覚えておいてください。

于 2012-08-22T00:14:50.970 に答える
0

あなたの解釈は正しいです。これは非常に奇妙なコードです。通常、いくつかの整数を一緒に xor し、結果をポインターとして扱いません。

の宣言の近くにあるヘッダー ファイルnodeを調べて、フィールドがエンコードする内容についての内容を確認します。そのようなコメントがない場合は、このコードからできるだけ早く逃げてください!

于 2012-08-21T23:01:24.047 に答える