请帮我澄清C++按值传递?

please help me clarify C++ pass by value?

提问人:Lionel 提问时间:10/15/2020 最后编辑:underscore_dLionel 更新时间:10/15/2020 访问量:79

问:

struct rec {
    int length;
    int breath;
};

int area(rec objrec1) {
    objrec1.length ++;
    //objrec1.breath;
    //int result= objrec1.length++ * objrec1.breath;
    return(objrec1.length++ * objrec1.breath);
    //return(result);
}

int main() {
    rec objrec = { 10,5 }; // create object to access struct
    int arearesult;
    arearesult = area(objrec); // we pass the whole struct into the parameter
    cout << arearesult << endl;
}

我的问题是,如果实际参数没有对形式参数进行更改,那么返回到主“arearesult”时长度 (++) 的增量如何影响结果,使答案为 55 而不是 50。因为我在想,如果我将长度增加 1 使其为 11,但是当它到达 main() 时,它将变得无效并变回 10,因为实际参数和形式参数中的长度不同。谢谢

C++ 函数 结构 引用传递

评论

4赞 463035818_is_not_an_ai 10/15/2020
你传递值,你把返回值签名给并打印它的值,这是两个不同的变量/对象objrecareresult
0赞 Galik 10/15/2020
但不会改变价值。objrec
1赞 molbdnilo 10/15/2020
目前还不清楚你认为会变得“无效”和“回头”的“它”是什么。该函数正在修改参数,但该参数是 的副本。它的工作原理与直接传递完全相同。objrecint
2赞 rustyx 10/15/2020
你可能想投资一本好的C++书。它涵盖了语言的这一点和许多其他方面。

答:

2赞 463035818_is_not_an_ai 10/15/2020 #1

您的问题可以归结为:

#include <iostream>

int foo ( int x ) { 
    x = 42;
    return x; 
}

int main {
    int a = 1;
    int b = 2;
    a = foo( b );
    std::cout << a << ' ' << b;
}

b按值传递。它不会通过调用 来修改,因为会修改 的副本。 不传递给函数,但获取分配的返回值。在那之后,它的价值与以前不同。foofooba

in main 的值是 ,因为这是从 返回的值。返回后,和 之间没有神奇的隐藏依赖关系。a42foofooab

评论

1赞 underscore_d 10/15/2020
x = 42; return x可能更清楚,因为 OP 似乎认为这句话意味着结果会“跟踪”,以至于它会恢复到外部......什么的。return xx2foo()
1赞 Useless 10/15/2020 #2

我在想,如果我将长度增加 1 使其为 11,但是当它到达 main() 时,它将变得无效并变回 10

没有单一变量。您有两个独立的对象,每个对象都有自己的独立对象。lengthlength

我们可以将您的电话改写为

int main() {
    rec objrec = { 10,5 }; // create object to access struct
    int arearesult;

    // manually inline this call:
    // arearesult = area(objrec); // we pass the whole struct into the parameter
    // int area(rec objrec1)
    {
        rec objrec1 = objrec;

        objrec1.length ++;

        arearesult = objrec1.length++ * objrec1.breath;

    } // objrec1 ceases existing here, objrec is unaffected

    cout << arearesult << endl;
}

并且您可以看到,除了初始化 .更改不会影响 。objrecobjrec1objrec1.lengthobjrec.length