c++中在链接列表的节点上使用括号的意义是什么?

问题描述 投票:0回答:1

在下面的代码中,有一个节点指针是 naya mn函数中。在 if 初次见面 naya 指针指向null,我们正试图访问它的数据。如果我们尝试做同样的代码,而不在 naya 指针,然后它给出错误,如。

prog.cpp: In function ‘void mn(Node*, Node**)’:
prog.cpp:66:50: error: request for member ‘data’ in ‘* naya’, which is of pointer type ‘Node*’ (maybe you meant to use ‘->’ ?)
     if(*naya == NULL || temp -> data <= *naya -> data)
                                             ^*

但是当我们使用括号的时候,它却能正常工作。为什么会出现这样的错误呢?

下面是整个代码。

#include <bits/stdc++.h>
using namespace std;
class Node {
 public:
  int data;
  Node* next = NULL;
  Node(int x) {
    data = x;
    next = NULL;
  }
};

void mn(Node* temp, Node** naya) {
  Node* current;

  if (*naya == NULL || temp->data <= (*naya)->data) {
    temp->next = *naya;
    *naya = temp;
  } else {
    current = *naya;
    while (current->next != NULL && (current->next->data < temp->data)) {
      current = current->next;
    }
    temp->next = current->next;
    current->next = temp;
  }
}
Node* isort(Node* head) {
  Node* temp = head;
  Node* naya = NULL;
  while (temp != NULL) {
    Node* nex1 = temp->next;
    mn(temp, &naya);
    temp = nex1;
  }
  return naya;
}
void printll(Node* head) {
  Node* temp = head;
  while (temp != NULL) {
    cout << temp->data;
    temp = temp->next;
  }
}
int main() {
  Node *head = NULL, *temp = NULL;
  int a;
  cin >> a;
  for (int i = 0; i < a; i++) {
    int x;
    cin >> x;
    Node* newnode = new Node(x);
    if (head == NULL) {
      head = newnode;
      temp = head;
    } else {
      temp->next = newnode;
      temp = temp->next;
    }
  }
  head = isort(head);
  printll(head);
}
c++ pointers linked-list segmentation-fault brackets
1个回答
2
投票

之所以要这样写,是因为 操作者优先,它决定使用哪些操作数执行哪些操作。从这个链接可以看出,"成员访问 "或 -> 绑定在 "定向(减指)"或 *a 默认情况下是这样的。通过将 dereference 操作用括号括起来,您可以指定您希望它在成员访问之前首先被绑定。

为了使这一点更加具体,在你的例子中 naya 是一个指针的指针。C++默认情况下会尝试先绑定成员访问操作的操作数(即) naya->data). 如果我们要在这里加上括号来明确顺序,那么它就会像这样。

*(naya->data)

这样做的结果是取消引用 naya 然后寻找 data 的成员变量。不过,dereferenced对象是指针,所以它没有任何的 data 成员的值。如果它在外面没有出错,它将继续尝试并反引用数据成员的值(the * 的一部分)。)

当你把 (*naya)->data你告诉C++它应该反引用 naya* 具体来说,不 (naya->data) 就像它默认的那样。(*naya) 是一个指向Node对象的指针,所以 -> 将成功找到数据成员。

© www.soinside.com 2019 - 2024. All rights reserved.