让我说我有如下片段的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
。那么,在f
对print()
的呼叫中,y =/= A[1]
是吗?
答案 0 :(得分:6)
当您将值传递给C ++中的函数时,它变为独立值,并且不再引用该数组。因此,y
在函数中等于1,并且其行为独立于A['1']
。
答案 1 :(得分:4)
在您的示例中,{strong}传递了x
和y
,这意味着正在复制值。在f()
内部,x
和y
被视为局部变量,对x
和y
所做的任何更改都不会反映回调用者。如果需要的话,您需要通过引用传递:
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]);
}
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]);
}