让它更容易?

时间:2011-03-03 22:01:58

标签: c

当我阅读the article时,这是C编程的简单注释,
在我的脑海里提出了一个问题。

我可以让下面的代码更容易阅读吗? 我尝试了几件事,但它仍然不酷。

if(goleft)
     p->left=p->right->left;
else
     p->right=p->left->right;

代码很简单。
p是指向节点的指针 节点是你能想到的。

你能告诉我一个好的答案吗?

7 个答案:

答案 0 :(得分:1)

很难说出上下文,但调用指针p并不是很具描述性。 nodenp可能会更好。

(这段代码并不那么简单,顺便说一下;在阅读它的时候,我想到的第一件事就是“不是内存泄漏吗?”)

答案 1 :(得分:1)

如果您认为需要使代码更具可读性,您可以始终采用客观的方式:

if (goleft)
  move_left(p);
else
  move_right(p);

答案 2 :(得分:1)

只要您将leftright作为两个显式字段,就很难了。但是,如果你有一个长度为2的数组,比如directions,你可以这样写:

  int dir = (goLeft ? 1 : 0);

  p->directions[dir] = p->directions[1 - dir]->directions[dir];

答案 3 :(得分:1)

一个小小的空白很长的路要走:

if(goleft)
{      
  p->left = p->right->left; 
}
else
{
  p->right = p->left->right;
} 

现在大约有20个人在为单个陈述使用{}而尖叫。让我们尖叫。它为代码提供了一些垂直的呼吸空间,这使得这些老化的眼睛更容易阅读,它可以防止当有人想要在其他情况下添加语句时出现的不可避免的运行时错误(比如两天前不咬我的那个)。

这几乎就像代码所能获得的那样可读(并且,随着可读性的提高,它并没有那么糟糕,至少对于C来说)。它很简单,很明显,任何人都知道发生了什么。为了让它“更漂亮”,试图将它隐藏在函数调用或宏之后是比IMO真正值得做的更多的工作。

答案 4 :(得分:0)

我不认为这在这种情况下确实有用,但我想到的第一件事就是这样:

if (goleft)
{
   npp = &(p->left);
   kid = p->right->left;
}
else
{
   npp = &(p->right);
   kid = p->left->right;
}
*npp = kid;

但我真的认为这根本没有帮助

答案 5 :(得分:0)

// a comment saying what this does
if( goleft ) p->left = p->right->left; 
else         p->right = p->left->right;

我不知道评论应该是什么,因为这段代码对我没有任何意义;它似乎会将p与其左侧或右侧继承者断开连接,而是将其指向自身,假设p->right->leftp->left->right本身是明智的p。而且测试没有意义,因为你没有“去”任何地方,你正在修改列表。有意义的是

Node* next = goleft? p->left : p->right;

我的评论是基于你的,这是一个双向链表。如果它是一个二叉树,那么代码会更有意义,但是你要移除一个节点但不保存链接。正如larsmans所说,这看起来像是内存泄漏。

答案 6 :(得分:-1)

一些空白和一些评论很长的路要走

if (goleft)
     /* skip the immediate left turn and use the next one instead */
     p->left = p->right->left;
else
     /* skip right turn */
     p->right = p->left->right;