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);

我对第一个代码的问题:迭代如何在按位异或运算中工作?什么prev = (Edge *) ( (int) prev ^ (int) edge[i] );意思?return 的价值是prev多少?
第二个代码的问题:减少运算符如何if ( --nextfrag->degree)在 if 语句中工作?
第三个代码:有没有其他方法可以编写该 for 语句?请向我解释一下 for 语句的意思,因为作为一个新手,我只是习惯于 i= 0; 我=某事;我++

抱歉这个愚蠢的问题,但你的解释会对我有很大帮助,在此先感谢:)

4

1 回答 1

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

(Edge *) 将结果转换为指向 Edge 对象(或 struct )的指针

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

该表达式将指针“prev”(边缘)转换为 int 并与数组元素 edge[i] 进行异或(不确定类型,因为此变量超出范围 - 但假设它是指向边缘的指针数组)。指针(地址)大小为 int。不确定算法是什么,但似乎假设这将导致一个新的有效指针地址指向另一个 Edge 用于下一次迭代。

--nextfrag->degree

在这种情况下,递减 nextfrag 指向的 degree 成员,它是指向具有“degree”成员的结构的指针。

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

这将遍历链表,直到 pedge->parent == 0 (链表中的头节点)

此代码非常依赖于打包在字边界上的结构。指针(地址)是 32 位或 64 位的,因此这是非常糟糕的代码,除非您绝对确定它将在其上运行的目标计算机,因为如果不明确打包您的结构,它可能会导致 32 位或 64 位计算机之间的不同结果。请参阅“#pragma 包”。

这并没有使它更容易理解。

于 2012-08-24T00:42:49.887 回答