Как мне проанализировать вывод этого кода с помощью структуры - PullRequest
0 голосов
/ 02 июля 2019

Итак, я получил этот код с, я должен определить вывод, но я не знаю, с чего начать. Может кто-нибудь, пожалуйста, скажите мне шаг за шагом, что происходит? Линия S(int V, S*...) и линия S s = S(10, new...) смущают меня больше всего.

У меня есть грубые знания об указателях и классах, но этого явно недостаточно.

Я знаю, что означает S* n и что s.n -> n, но S s смущает меня

Я пытался следовать коду шаг за шагом, но затерялся в строке S(int V, S* N....)

struct S {
    S* n;
    int v;
    S(int V, S* N) : n(N), v(V) {};
};

S s = S(10, new S(20, &s));
std::cout << (s.n->n->v);

Вывод 10, но я не знаю почему.

Ответы [ 3 ]

2 голосов
/ 02 июля 2019

Давайте посмотрим на строку кода на строку:

Struct S {
   // ...
};

Это создает структуру с именем S. Внутри есть две переменные (члены структуры):

S* n;
int v;

Чтобы создать объект типа S, вы определили «конструктор»:

S(int V, S* N) : n(N), v(V) {};

, который принимает целое число и указатель на структуру S, которые оба непосредственно назначаются членам создаваемого объекта.


Затем в основной части кода:

S s = S(10, new S(20, &s));

Объект s создан. Внутри целое число v равно 10, и вы можете получить доступ с помощью s.v. Существует также n, указатель на структуру S, доступный с s.n.

У этого n также есть два параметра, на этот раз доступных с ->, поскольку он является указателем.

  • s.n->v назначено равным 20.
  • s.n->n назначается указателем на s, определенным ранее.

Таким образом, вы можете упростить s.n->n до указателя на s.

Таким образом, печать:

std::cout << (s.n->n->v);

эквивалентно

std::cout << s.v;

и ответ 10.

0 голосов
/ 02 июля 2019

Первая сбивающая с толку строка - это просто конструктор, который инициализирует struct членов с такими аргументами:

struct S {
    S* n;  // <-- N goes here
    int v; // <-- V goes here
    S(int V, S* N) : n(N), v(V) {};
};

Вторая запутанная строка строит два объекта типа S, давайте разберем это:

//       this goes to s1.v
//       |
//       |   this goes to s1.n
//       v   v~~~~~~~~~~~~~
S s1 = S(10, new S(20, &s1));
//           ^~~~~~~~~~~~~~
//           let's call this s2

, а теперь s1.n == s2 и s2->n == &s1, поэтому s1.n->n == &s1 и s1.n->n->v == 10.

0 голосов
/ 02 июля 2019
struct S{
        S* n
        int v;
        S(int V, S* N): n(N), v(V){};
        };

S s = S(10,new S(20,&s));
cout << (s.n->n->v);

sn дает вам s в левой части от "=", затем -> n дает вам (S * n) структуру из S (20, & s), которая является той же самой s, которая имеет значение 10 и -> v возвращает значение 10

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...