通过名称调用传递参数

时间:2019-06-23 18:21:54

标签: c++ parameters

让我说我有如下片段的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在对f的调用中如何将print()设为1。 y在开始时和A[A[1]]=A[2]=1更改为A[1]--之后是否不与A[A[1]]=A[1]=1绑定?之后,y++将不等于y到2?

此外,为了使A[1]A[1]--之后变为2,必须以某种方式将其递增1,这正是y++的作用,这意味着y++=A[1]++=2 。那么,在fprint()的呼叫中,y =/= A[1]是吗?

3 个答案:

答案 0 :(得分:6)

当您将值传递给C ++中的函数时,它变为独立值,并且不再引用该数组。因此,y在函数中等于1,并且其行为独立于A['1']

答案 1 :(得分:4)

在您的示例中,{strong}传递了xy ,这意味着正在复制。在f()内部,xy被视为局部变量,对xy所做的任何更改都不会反映回调用者。如果需要的话,您需要通过引用传递

void f(int &x, int &y)

答案 2 :(得分:2)

通过名称传递的方法是传递函子而不是单个(int)参数:

所以,像这样:

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]);
}

Demo

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]);
}

Demo