将表达式作为参数传递给Call

时间:2010-06-12 07:28:43

标签: parameter-passing

所有

当我们将表达式作为参数传递时,评估是如何进行的?这是一个小例子。这只是伪代码类

f (x,y)
{
    y = y+1;
    x = x+y;
}
main()
{
    a = 2; b = 2;
    f(a+b, a)
    print a;
}

访问x中的变量f时,是否访问包含a+b结果的临时变量的地址,或者是否会访问a的各个地址和b,然后评估a+b

的值

请帮忙。

此致 darkie15

2 个答案:

答案 0 :(得分:1)

有些语言依赖,但在C ++中

f(a+b, a)

计算a + b并将评估结果推送到堆栈,然后将对此值的引用传递给f()。这只有在f()的第一个参数是s const引用时才有效,因为像a + b的结果这样的临时对象只能绑定到const引用。

答案 1 :(得分:1)

在C或C ++中,只要x和y不是指针(在这种情况下表达式无论如何都是有用的),它们都会在函数调用之前进行求值,并且结果的VALUE被压入堆栈。根本没有参考。

C和C ++中的所有参数始终按值传递。如果将引用类型(例如int *,int&)传递给函数,则传递引用的VALUE。虽然可以通过访问函数中的* x来更改引用的对象,但仍无法更改引用的值,因为C和C ++参数始终始终仅按值传递。

编辑:C和C ++中的一个例外情况是,某些重载运算符的定义如下:

T* operator+ (L lhs, R rhs) {return new T(lhs, rhs);}

且x是L,y是R.在这种情况下,函数生成的T *的值作为参数被压入堆栈。不要写那样的代码,它会让其他程序员感到困惑= D。