使用按名称调用传递参数 让我说我有这个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]); }

使用按名称调用传递参数 让我说我有这个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]); },c++,parameters,C++,Parameters,我想在f()中使用名称调用传递A[0]和A[A[1]] 在这种情况下,打印的结果应该是:12(这是我们老师给我们上的编程语言课)。但是,我无法理解y如何在f调用print()时成为1。y不是在A[1]]=A[2]=1开始和之后绑定了A[1]=A[1]=1吗--更改为A[A[1]=A[1]=1?之后,y++不会使y等于2 此外,为了使A[1]在A[1]-之后变为2,它必须以某种方式增加1,这正是y++所做的,意思是y++=A[1]++=2。因此,在 f>代码>调用打印()/,代码> y= /a=1

我想在
f()
中使用名称调用传递
A[0]
A[A[1]]

在这种情况下,打印的结果应该是:
12
(这是我们老师给我们上的编程语言课)。但是,我无法理解
y
如何在
f
调用
print()
时成为1。
y
不是在
A[1]]=A[2]=1
开始和之后绑定了
A[1]=A[1]=1
吗--更改为
A[A[1]=A[1]=1
?之后,
y++
不会使
y
等于2


此外,为了使
A[1]
A[1]-
之后变为2,它必须以某种方式增加1,这正是
y++
所做的,意思是
y++=A[1]++=2
。因此,在<代码> f>代码>调用<代码>打印()/<代码>,代码> y= /a=1 [ <代码> > /p> < p>当您将值传递给C++中的函数时,它将成为独立值,不再引用数组。正因为如此,代码代码>函数中的1,它独立于<代码> A[1] ] /> > < p>当你将一个值传递给C++中的函数时,它就变成一个独立的值,不再引用数组。因此,
y
在函数中等于1,它独立于
A['1']

在您的示例中,
x
y
通过值传递,这意味着正在制作值的副本。在
f()
内部,
x
y
被视为局部变量,对
x
y
所做的任何更改都不会反映回调用者。如果需要,您需要通过引用传递:

void f(int &x, int &y)

在您的示例中,
x
y
通过值传递,这意味着正在制作值的副本。在
f()
内部,
x
y
被视为局部变量,对
x
y
所做的任何更改都不会反映回调用者。如果需要,您需要通过引用传递:

void f(int &x, int &y)

按名称传递的方法是传递functor,而不是单个(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]);
}

按名称传递的方法是传递functor,而不是单个(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]);
}


C++不支持按名称调用。你是指按值调用吗?@ ToMasabbLK我知道它是假设的。代码应该是C++的,我不知道标签是什么。give@Epitheoritis32请详细说明。询问假设的功能是没有用的。那么你应该选择一种支持按名称呼叫的语言。按名称调用意味着传递语句而不是值。这些语句是在函数中进行惰性计算的,而不是在函数调用时。我甚至不确定对一个按名称调用参数的赋值在假设情况下是如何工作的。我知道的语言可以用名字来调用,Haskell(斯卡拉)和这两种语言都是不可变的。C++不支持按名称调用。你是指按值调用吗?@ ToMasabbLK我知道它是假设的。代码应该是C++的,我不知道标签是什么。give@Epitheoritis32请详细说明。询问假设的功能是没有用的。那么你应该选择一种支持按名称呼叫的语言。按名称调用意味着传递语句而不是值。这些语句是在函数中进行惰性计算的,而不是在函数调用时。我甚至不确定对一个按名称调用参数的赋值在假设情况下是如何工作的。我所知道的可以按名称调用的语言是Haskell(有点)和Scala,在这两种语言中,CBN参数都是不可变的。充其量这是一个注释。我的意思是,它是有效的,但比简单地通过引用传递要混乱得多。@Chipster:而通过引用传递
a[0]
就足够了,
a[1]]
依赖于
A[1]
的(可变)中间值,因此引用无效。我不确定我是否理解。为什么它不能工作
A[1]=2
,所以
A[A[1]
不应该导致传递
A[2]
y引用吗?@Chipster:但是OP希望如果
A[1]
在函数内部被修改(使用所述0),它不再是
A[2]
而是
A[0]
(正如
A[1]
现在是
A[0]
)。一个丑陋的替代方法是使用宏:
#define f(x,y)do{(x)+A[1];(y)+print((x),(y),A[0],A[1],A[2]);}while(0)
。我的意思是,它是有效的,但比简单地通过引用传递要麻烦得多。@Chipster:虽然通过引用传递
A[0]
就足够了,
A[1]
取决于(可变的)
A[1]
的中间值,因此引用无效。我不确定是否理解。为什么它不能工作
A[1]=2
,所以
A[A[1]
不应该导致传递
A[2]
y引用吗?@Chipster:但是OP希望如果
A[1]
在函数内部被修改(使用所述0),它不再是
A[2]
而是
A[0]
(正如
A[1]
现在是
A[0]
)。一个丑陋的替代方法是使用宏:
#定义f(x,y)do{(x)+A[1];(y)+;print((x),(y),A[0],A[1],A[2]);}而(0)