编程访谈中的错误暴露?

时间:2011-03-01 06:56:28

标签: c++

我找不到本书第2版的勘误表。我的问题涉及以下代码中的if语句。

void removeHead (Node ** head) {
  Node * temp;
  if (!(*head)) {
    temp = (*head)->next;
    delete *head;
    *head = temp;
  }
}

所以我理解if语句的要点是检查Node是否为null。但是通过添加额外的“!”对评估,这不会否定null的错误值吗?将其更改为以下内容是否正确:

if (*head) { ... }

此外,如果有人知道我在哪里可以找到第二版的官方勘误表,那将是很棒的。

谢谢,

萨姆

6 个答案:

答案 0 :(得分:9)

这本书有点瑕疵,它首先声称*head作为输入没有问题,然后进一步发展说你应该真正传入**head,然后说你应该检查*head。您确实需要检查*headhead

对于if (!(*head)),如果*head为NULL,则为if (!0),这将是真的。然后我们尝试(0)->next并死亡。绝对是个错误。

答案 1 :(得分:2)

显示的代码不正确:如果*head为空,则取消引用它,这肯定是不正确的。

答案 2 :(得分:2)

head是指向Node的指针,你不仅需要检查第二级指针不是null,还要检查第一级指针是否为null,你可以通过添加条件head != NULL

此外,正如您在评论中正确指出的那样,条件!(*head)实际上与您想要执行的操作相反(当true为NULL时,它将为*head)。请使用*head != NULL,它更易读,且不易出错。

答案 3 :(得分:1)

怀疑,无论平台是什么,NULL的值都被认为是零

我对此表示怀疑,我认为比较应始终是wrt

if( * head != NULL ) 
 {  ... }

答案 4 :(得分:0)

*的 *头戴式> *&头戴式GT;头即可。当您执行*head时,您将取消引用中间位置。当为NULL时,输入if循环。因此,如果它为NULL,它如何指向head并要求成员变量next。这应该可行,如你所建议的那样 -

if((*head) != NULL )
{
  // ...
}

答案 5 :(得分:0)

摆脱!

然后将删除更改为免费并重新标记C