Передача параметров с использованием вызова по имени - PullRequest
1 голос
/ 23 июня 2019

Допустим, у меня есть этот фрагмент кода, похожий на C ++:

int A[3] = {0, 2, 1};

void f(int x, int y) {
    x++; A[1]--; y++;
    print(x, y, A[0], A[1], A[2]);
}

void main() {
    f(A[0], A[A[1]]);
    print(A[0], A[1], A[2]);
}

Я хотел бы передать A[0] и A[A[1]] в f() с использованием вызова по имени.

Вв подобной ситуации напечатанные результаты должны быть: 1 1 1 2 1 1 2 1 (это из класса языков программирования, предоставленного нашим учителем).Однако я не могу понять, как y может быть 1 в f при вызове print().Разве y не связывается с A[A[1]]=A[2]=1 при запуске и после A[1]-- меняется на A[A[1]]=A[1]=1? После этого y++ не сделает y равным 2?

Более того, вчтобы A[1] было равно 2 после A[1]--, его нужно как-то увеличить на 1, и это именно то, что делает y++, что означает y++=A[1]++=2.Итак, в f вызове print(), y =/= A[1]?

Ответы [ 3 ]

6 голосов
/ 23 июня 2019

Когда вы передаете значение функции в C ++, оно становится независимым значением и больше не ссылается на массив.Из-за этого y равно 1 в функции и действует независимо от A['1'].

4 голосов
/ 23 июня 2019

В вашем примере x и y передаются по значению , что означает копий значений, которые создаются.Внутри f(), x и y обрабатываются как локальные переменные, и любые изменения, сделанные в x и y, не отражаются обратно для вызывающей стороны.Если вы хотите этого, вам нужно передать по ссылке вместо:

void f(int &x, int &y)
2 голосов
/ 23 июня 2019

Способ передачи по имени будет состоять в том, чтобы передать функтор вместо отдельных (целых) параметров:

Итак, что-то вроде:

template <typename X, typename Y>
void f(X x, Y y) { // or void f(std::function<int&()> x, std::function<int&()> y)
    x()++; A[1]--; y()++;
    print(x, y, A[0], A[1], A[2]);
}

int main() {
    f([]() -> int&{ return A[0];}, []() -> int&{ return A[A[1]];});
    print(A[0], A[1], A[2]);
}

Демо

Уродливой альтернативой является MACRO:

#define f(x, y) do { (x)++; A[1]--; (y)++; print((x), (y), A[0], A[1], A[2]); } while (0)

int main() {
    f(A[0], A[A[1]]);
    print(A[0], A[1], A[2]);
}

Демо

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